Merge branch 'master' of https://github.com/GTAmodding/re3
This commit is contained in:
commit
0bea6d039b
@ -1,54 +0,0 @@
|
|||||||
version: 1.0.{build}
|
|
||||||
image: Visual Studio 2019
|
|
||||||
configuration:
|
|
||||||
- Debug
|
|
||||||
- Release
|
|
||||||
platform:
|
|
||||||
- win-x86-librw_d3d9-mss
|
|
||||||
- win-x86-librw_gl3_glfw-mss
|
|
||||||
environment:
|
|
||||||
APPVEYOR_SAVE_CACHE_ON_ERROR: true
|
|
||||||
GLEW_VER: "2.1.0"
|
|
||||||
GLFW_VER: "3.3.2"
|
|
||||||
GLEW_BASE: glew-%GLEW_VER%
|
|
||||||
GLFW_BASE: glfw-%GLFW_VER%.bin.WIN32
|
|
||||||
GLEW_FILE: "%GLEW_BASE%-win32.zip"
|
|
||||||
GLFW_FILE: "%GLFW_BASE%.zip"
|
|
||||||
GLEW_URL: https://github.com/nigels-com/glew/releases/download/%GLEW_BASE%/%GLEW_FILE%
|
|
||||||
GLFW_URL: https://github.com/glfw/glfw/releases/download/%GLFW_VER%/%GLFW_FILE%
|
|
||||||
install:
|
|
||||||
- IF [%PLATFORM%] == [win-x86-librw_gl3_glfw-mss] IF NOT EXIST %GLEW_FILE% appveyor DownloadFile %GLEW_URL% -FileName "%APPVEYOR_BUILD_FOLDER%/%GLEW_FILE%"
|
|
||||||
- IF [%PLATFORM%] == [win-x86-librw_gl3_glfw-mss] 7z x "%APPVEYOR_BUILD_FOLDER%/%GLEW_FILE%"
|
|
||||||
- IF [%PLATFORM%] == [win-x86-librw_gl3_glfw-mss] IF NOT EXIST %GLFW_FILE% appveyor DownloadFile %GLFW_URL% -FileName "%APPVEYOR_BUILD_FOLDER%/%GLFW_FILE%"
|
|
||||||
- IF [%PLATFORM%] == [win-x86-librw_gl3_glfw-mss] 7z x "%APPVEYOR_BUILD_FOLDER%/%GLFW_FILE%"
|
|
||||||
- cmd: >-
|
|
||||||
git submodule update --init --recursive
|
|
||||||
|
|
||||||
premake5 vs2019 --with-librw --glewdir=%APPVEYOR_BUILD_FOLDER%/%GLEW_BASE% --glfwdir32=%APPVEYOR_BUILD_FOLDER%/%GLFW_BASE%
|
|
||||||
|
|
||||||
build:
|
|
||||||
project: build/re3.sln
|
|
||||||
verbosity: minimal
|
|
||||||
after_build:
|
|
||||||
- 7z a "re3_%configuration%_%platform%_%APPVEYOR_BUILD_VERSION%.zip" bin/%PLATFORM%/%CONFIGURATION%/re3.exe bin/%PLATFORM%/%CONFIGURATION%/re3.pdb
|
|
||||||
artifacts:
|
|
||||||
- path: "re3_%configuration%_%platform%_%APPVEYOR_BUILD_VERSION%.zip"
|
|
||||||
name: re3
|
|
||||||
deploy:
|
|
||||||
- provider: BinTray
|
|
||||||
username: shfil119
|
|
||||||
api_key:
|
|
||||||
secure: xWnYDfNWM87iPoBFbz6L1XAduxijJRWSpQLhMDOjznmzbMCsORtdx2tmWmFLTwf6
|
|
||||||
subject: gtamodding
|
|
||||||
repo: re3
|
|
||||||
package: "%configuration%_%platform%"
|
|
||||||
version: "%APPVEYOR_BUILD_VERSION%"
|
|
||||||
artifact: re3
|
|
||||||
publish: true
|
|
||||||
on:
|
|
||||||
branch: master
|
|
||||||
APPVEYOR_REPO_TAG: true
|
|
||||||
|
|
||||||
cache:
|
|
||||||
- "%GLEW_FILE%"
|
|
||||||
- "%GLFW_FILE%"
|
|
28
.clang-format
Normal file
28
.clang-format
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
---
|
||||||
|
AllowShortBlocksOnASingleLine: 'true'
|
||||||
|
AllowShortCaseLabelsOnASingleLine: 'true'
|
||||||
|
AllowShortIfStatementsOnASingleLine: 'true'
|
||||||
|
AllowShortLoopsOnASingleLine: 'true'
|
||||||
|
AlwaysBreakAfterReturnType: TopLevel
|
||||||
|
AccessModifierOffset: -8
|
||||||
|
BreakBeforeBraces: Linux
|
||||||
|
ColumnLimit: 160
|
||||||
|
IndentCaseLabels: 'false'
|
||||||
|
IndentWidth: '8'
|
||||||
|
Language: Cpp
|
||||||
|
PointerAlignment: Right
|
||||||
|
SpaceAfterCStyleCast: 'false'
|
||||||
|
SpaceBeforeAssignmentOperators: 'true'
|
||||||
|
SpaceBeforeCtorInitializerColon: 'true'
|
||||||
|
SpaceBeforeInheritanceColon: 'true'
|
||||||
|
SpaceBeforeParens: Never
|
||||||
|
SpaceInEmptyParentheses: 'false'
|
||||||
|
SpacesInAngles: 'false'
|
||||||
|
SpacesInCStyleCastParentheses: 'false'
|
||||||
|
SpacesInContainerLiterals: 'false'
|
||||||
|
SpacesInParentheses: 'false'
|
||||||
|
SpacesInSquareBrackets: 'false'
|
||||||
|
TabWidth: '8'
|
||||||
|
UseTab: ForIndentation
|
||||||
|
|
||||||
|
...
|
@ -1,10 +1,6 @@
|
|||||||
# re3
|
# re3
|
||||||
[![Build status](https://ci.appveyor.com/api/projects/status/hyiwgegks122h8jg/branch/master?svg=true)](https://ci.appveyor.com/project/aap/re3/branch/master)
|
[![Build Status](https://img.shields.io/endpoint.svg?url=https%3A%2F%2Factions-badge.atrox.dev%2FGTAmodding%2Fre3%2Fbadge%3Fref%3Dmaster&style=flat)](https://actions-badge.atrox.dev/GTAmodding/re3/goto?ref=master)
|
||||||
<a href="https://discord.gg/aKYAwCx92H"><img src="https://img.shields.io/badge/discord-join-7289DA.svg?logo=discord&longCache=true&style=flat" /></a>
|
<a href="https://discord.gg/aKYAwCx92H"><img src="https://img.shields.io/badge/discord-join-7289DA.svg?logo=discord&longCache=true&style=flat" /></a>
|
||||||
| Platform | Debug | Release |
|
|
||||||
|------------------|-------------|-------------|
|
|
||||||
| Windows Direct3D9 | [![Download](https://api.bintray.com/packages/gtamodding/re3/Debug_win-x86-librw_d3d9-mss/images/download.svg)](https://bintray.com/gtamodding/re3/Debug_win-x86-librw_d3d9-mss/_latestVersion) | [![Download](https://api.bintray.com/packages/gtamodding/re3/Release_win-x86-librw_d3d9-mss/images/download.svg)](https://bintray.com/gtamodding/re3/Release_win-x86-librw_d3d9-mss/_latestVersion) |
|
|
||||||
| Windows OpenGL3.3 | [![Download](https://api.bintray.com/packages/gtamodding/re3/Debug_win-x86-librw_gl3_glfw-mss/images/download.svg)](https://bintray.com/gtamodding/re3/Debug_win-x86-librw_gl3_glfw-mss/_latestVersion) | [![Download](https://api.bintray.com/packages/gtamodding/re3/Release_win-x86-librw_gl3_glfw-mss/images/download.svg)](https://bintray.com/gtamodding/re3/Release_win-x86-librw_gl3_glfw-mss/_latestVersion) |
|
|
||||||
|
|
||||||
## Intro
|
## Intro
|
||||||
|
|
||||||
|
Binary file not shown.
199
gamefiles/gamecontrollerdb.txt
Normal file
199
gamefiles/gamecontrollerdb.txt
Normal file
@ -0,0 +1,199 @@
|
|||||||
|
# Windows - DINPUT
|
||||||
|
8f0e1200000000000000504944564944,Acme,platform:Windows,x:b2,a:b0,b:b1,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b6,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a2,
|
||||||
|
341a3608000000000000504944564944,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
|
ffff0000000000000000504944564944,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,
|
||||||
|
6d0416c2000000000000504944564944,Generic DirectInput Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
|
0d0f6e00000000000000504944564944,HORIPAD 4,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Windows,
|
||||||
|
6d0419c2000000000000504944564944,Logitech F710 Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
|
88880803000000000000504944564944,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.8,dpleft:h0.4,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b9,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b0,y:b3,platform:Windows,
|
||||||
|
4c056802000000000000504944564944,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Windows,
|
||||||
|
25090500000000000000504944564944,PS3 DualShock,a:b2,b:b1,back:b9,dpdown:h0.8,dpleft:h0.4,dpright:h0.2,dpup:h0.1,guide:,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b0,y:b3,platform:Windows,
|
||||||
|
4c05c405000000000000504944564944,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||||
|
6d0418c2000000000000504944564944,Logitech RumblePad 2 USB,platform:Windows,x:b0,a:b1,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,
|
||||||
|
36280100000000000000504944564944,OUYA Controller,platform:Windows,a:b0,b:b3,y:b2,x:b1,start:b14,guide:b15,leftstick:b6,rightstick:b7,leftshoulder:b4,rightshoulder:b5,dpup:b8,dpleft:b10,dpdown:b9,dpright:b11,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:b12,righttrigger:b13,
|
||||||
|
4f0400b3000000000000504944564944,Thrustmaster Firestorm Dual Power,a:b0,b:b2,y:b3,x:b1,start:b10,guide:b8,back:b9,leftstick:b11,rightstick:b12,leftshoulder:b4,rightshoulder:b6,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b5,righttrigger:b7,platform:Windows,
|
||||||
|
00f00300000000000000504944564944,RetroUSB.com RetroPad,a:b1,b:b5,x:b0,y:b4,back:b2,start:b3,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,platform:Windows,
|
||||||
|
00f0f100000000000000504944564944,RetroUSB.com Super RetroPort,a:b1,b:b5,x:b0,y:b4,back:b2,start:b3,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,platform:Windows,
|
||||||
|
28040140000000000000504944564944,GamePad Pro USB,platform:Windows,a:b1,b:b2,x:b0,y:b3,back:b8,start:b9,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,lefttrigger:b6,righttrigger:b7,
|
||||||
|
ff113133000000000000504944564944,SVEN X-PAD,platform:Windows,a:b2,b:b3,y:b1,x:b0,start:b5,back:b4,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a4,lefttrigger:b8,righttrigger:b9,
|
||||||
|
8f0e0300000000000000504944564944,Piranha xtreme,platform:Windows,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a2,
|
||||||
|
8f0e0d31000000000000504944564944,Multilaser JS071 USB,platform:Windows,a:b1,b:b2,y:b3,x:b0,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,
|
||||||
|
10080300000000000000504944564944,PS2 USB,platform:Windows,a:b2,b:b1,y:b0,x:b3,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a4,righty:a2,lefttrigger:b4,righttrigger:b5,
|
||||||
|
79000600000000000000504944564944,G-Shark GS-GP702,a:b2,b:b1,x:b3,y:b0,back:b8,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a4,lefttrigger:b6,righttrigger:b7,platform:Windows,
|
||||||
|
4b12014d000000000000504944564944,NYKO AIRFLO,a:b0,b:b1,x:b2,y:b3,back:b8,guide:b10,start:b9,leftstick:a0,rightstick:a2,leftshoulder:a3,rightshoulder:b5,dpup:h0.1,dpdown:h0.0,dpleft:h0.8,dpright:h0.2,leftx:h0.6,lefty:h0.12,rightx:h0.9,righty:h0.4,lefttrigger:b6,righttrigger:b7,platform:Windows,
|
||||||
|
d6206dca000000000000504944564944,PowerA Pro Ex,a:b1,b:b2,x:b0,y:b3,back:b8,guide:b12,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.0,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Windows,
|
||||||
|
a3060cff000000000000504944564944,Saitek P2500,a:b2,b:b3,y:b1,x:b0,start:b4,guide:b10,back:b5,leftstick:b8,rightstick:b9,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,platform:Windows,
|
||||||
|
4f0415b3000000000000504944564944,Thrustmaster Dual Analog 3.2,platform:Windows,x:b1,a:b0,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b6,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,
|
||||||
|
6f0e1e01000000000000504944564944,Rock Candy Gamepad for PS3,platform:Windows,a:b1,b:b2,x:b0,y:b3,back:b8,start:b9,guide:b12,leftshoulder:b4,rightshoulder:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,
|
||||||
|
83056020000000000000504944564944,iBuffalo USB 2-axis 8-button Gamepad,a:b1,b:b0,y:b2,x:b3,start:b7,back:b6,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,platform:Windows,
|
||||||
|
10080100000000000000504944564944,PS1 USB,platform:Windows,a:b2,b:b1,x:b3,y:b0,back:b8,start:b9,leftshoulder:b6,rightshoulder:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a2,lefttrigger:b4,righttrigger:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,
|
||||||
|
49190204000000000000504944564944,Ipega PG-9023,a:b0,b:b1,x:b3,y:b4,back:b10,start:b11,leftstick:b13,rightstick:b14,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:b8,righttrigger:b9,platform:Windows,
|
||||||
|
4f0423b3000000000000504944564944,Dual Trigger 3-in-1,a:b1,b:b2,x:b0,y:b3,back:b8,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:b6,righttrigger:b7,platform:Windows,
|
||||||
|
0d0f4900000000000000504944564944,Hatsune Miku Sho Controller,a:b1,b:b2,x:b0,y:b3,back:b8,guide:b12,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Windows,
|
||||||
|
79004318000000000000504944564944,Mayflash GameCube Controller Adapter,platform:Windows,a:b1,b:b2,x:b0,y:b3,back:b0,start:b9,guide:b0,leftshoulder:b4,rightshoulder:b7,leftstick:b0,rightstick:b0,leftx:a0,lefty:a1,rightx:a5,righty:a2,lefttrigger:a3,righttrigger:a4,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,
|
||||||
|
79000018000000000000504944564944,Mayflash WiiU Pro Game Controller Adapter (DInput),a:b1,b:b2,x:b0,y:b3,back:b8,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Windows,
|
||||||
|
2509e803000000000000504944564944,Mayflash Wii Classic Controller,a:b1,b:b0,x:b3,y:b2,back:b8,guide:b10,start:b9,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:b11,dpdown:b13,dpleft:b12,dpright:b14,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Windows,
|
||||||
|
300f1001000000000000504944564944,Saitek P480 Rumble Pad,a:b2,b:b3,x:b0,y:b1,back:b8,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b6,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a2,lefttrigger:b5,righttrigger:b7,platform:Windows,
|
||||||
|
10280900000000000000504944564944,8Bitdo SFC30 GamePad,a:b1,b:b0,y:b3,x:b4,start:b11,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,platform:Windows,
|
||||||
|
63252305000000000000504944564944,USB Vibration Joystick (BM),platform:Windows,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,
|
||||||
|
20380900000000000000504944564944,8Bitdo NES30 PRO Wireless,platform:Windows,a:b0,b:b1,x:b3,y:b4,leftshoulder:b6,rightshoulder:b7,lefttrigger:b8,righttrigger:b9,back:b10,start:b11,leftstick:b13,rightstick:b14,leftx:a0,lefty:a1,rightx:a3,righty:a4,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,
|
||||||
|
02200090000000000000504944564944,8Bitdo NES30 PRO USB,platform:Windows,a:b0,b:b1,x:b3,y:b4,leftshoulder:b6,rightshoulder:b7,lefttrigger:b8,righttrigger:b9,back:b10,start:b11,leftstick:b13,rightstick:b14,leftx:a0,lefty:a1,rightx:a3,righty:a4,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,
|
||||||
|
ff113133000000000000504944564944,Gembird JPD-DualForce,platform:Windows,a:b2,b:b3,x:b0,y:b1,start:b9,back:b8,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a4,lefttrigger:b6,righttrigger:b7,leftstick:b10,rightstick:b11,
|
||||||
|
341a0108000000000000504944564944,EXEQ RF USB Gamepad 8206,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,leftstick:b8,rightstick:b7,back:b8,start:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,platform:Windows,
|
||||||
|
c0111352000000000000504944564944,Battalife Joystick,platform:Windows,x:b4,a:b6,b:b7,y:b5,back:b2,start:b3,leftshoulder:b0,rightshoulder:b1,leftx:a0,lefty:a1,
|
||||||
|
100801e5000000000000504944564944,NEXT Classic USB Game Controller,a:b0,b:b1,back:b8,start:b9,rightx:a2,righty:a3,leftx:a0,lefty:a1,platform:Windows,
|
||||||
|
4c05cc09000000000000504944564944,Sony DualShock 4,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b13,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Windows,
|
||||||
|
4c05a00b000000000000504944564944,Sony DualShock 4 Wireless Adaptor,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b13,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Windows,
|
||||||
|
|
||||||
|
# OS X
|
||||||
|
0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X,
|
||||||
|
6d0400000000000016c2000000000000,Logitech F310 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||||
|
6d0400000000000018c2000000000000,Logitech F510 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||||
|
6d040000000000001fc2000000000000,Logitech F710 Gamepad (XInput),a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,
|
||||||
|
6d0400000000000019c2000000000000,Logitech Wireless Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||||
|
4c050000000000006802000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Mac OS X,
|
||||||
|
4c05000000000000c405000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||||
|
5e040000000000008e02000000000000,X360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,
|
||||||
|
891600000000000000fd000000000000,Razer Onza Tournament,a:b0,b:b1,y:b3,x:b2,start:b8,guide:b10,back:b9,leftstick:b6,rightstick:b7,leftshoulder:b4,rightshoulder:b5,dpup:b11,dpleft:b13,dpdown:b12,dpright:b14,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Mac OS X,
|
||||||
|
4f0400000000000000b3000000000000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,y:b3,x:b1,start:b10,guide:b8,back:b9,leftstick:b11,rightstick:,leftshoulder:b4,rightshoulder:b6,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b5,righttrigger:b7,platform:Mac OS X,
|
||||||
|
8f0e0000000000000300000000000000,Piranha xtreme,platform:Mac OS X,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a2,
|
||||||
|
0d0f0000000000004d00000000000000,HORI Gem Pad 3,platform:Mac OS X,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,
|
||||||
|
79000000000000000600000000000000,G-Shark GP-702,a:b2,b:b1,x:b3,y:b0,back:b8,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:b6,righttrigger:b7,platform:Mac OS X,
|
||||||
|
4f0400000000000015b3000000000000,Thrustmaster Dual Analog 3.2,platform:Mac OS X,x:b1,a:b0,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b6,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,
|
||||||
|
AD1B00000000000001F9000000000000,Gamestop BB-070 X360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,
|
||||||
|
050000005769696d6f74652028303000,Wii Remote,a:b4,b:b5,y:b9,x:b10,start:b6,guide:b8,back:b7,dpup:b2,dpleft:b0,dpdown:b3,dpright:b1,leftx:a0,lefty:a1,lefttrigger:b12,righttrigger:,leftshoulder:b11,platform:Mac OS X,
|
||||||
|
83050000000000006020000000000000,iBuffalo USB 2-axis 8-button Gamepad,a:b1,b:b0,x:b3,y:b2,back:b6,start:b7,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,platform:Mac OS X,
|
||||||
|
5e04000000000000dd02000000000000,Xbox One Wired Controller,platform:Mac OS X,x:b2,a:b0,b:b1,y:b3,back:b9,guide:b10,start:b8,dpleft:b13,dpdown:b12,dpright:b14,dpup:b11,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b6,rightstick:b7,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||||
|
050000005769696d6f74652028313800,Wii U Pro Controller,a:b16,b:b15,x:b18,y:b17,back:b7,guide:b8,start:b6,leftstick:b23,rightstick:b24,leftshoulder:b19,rightshoulder:b20,dpup:b11,dpdown:b12,dpleft:b13,dpright:b14,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b21,righttrigger:b22,platform:Mac OS X,
|
||||||
|
79000000000000000018000000000000,Mayflash WiiU Pro Game Controller Adapter (DInput),a:b4,b:b8,x:b0,y:b12,back:b32,start:b36,leftstick:b40,rightstick:b44,leftshoulder:b16,rightshoulder:b20,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a4,rightx:a8,righty:a12,lefttrigger:b24,righttrigger:b28,platform:Mac OS X,
|
||||||
|
2509000000000000e803000000000000,Mayflash Wii Classic Controller,a:b1,b:b0,x:b3,y:b2,back:b8,guide:b10,start:b9,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:b11,dpdown:b13,dpleft:b12,dpright:b14,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Mac OS X,
|
||||||
|
351200000000000021ab000000000000,SFC30 Joystick,a:b1,b:b0,x:b4,y:b3,back:b10,start:b11,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,platform:Mac OS X,
|
||||||
|
b4040000000000000a01000000000000,Sega Saturn USB Gamepad,a:b0,b:b1,x:b3,y:b4,back:b5,guide:b2,start:b8,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,platform:Mac OS X,
|
||||||
|
10280000000000000900000000000000,8Bitdo SFC30 GamePad,a:b1,b:b0,x:b4,y:b3,back:b10,start:b11,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,platform:Mac OS X,
|
||||||
|
d814000000000000cecf000000000000,MC Cthulhu,platform:Mac OS X,leftx:,lefty:,rightx:,righty:,lefttrigger:b6,a:b1,b:b2,y:b3,x:b0,start:b9,back:b8,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,righttrigger:b7,
|
||||||
|
0d0f0000000000006600000000000000,HORIPAD FPS PLUS 4,platform:Mac OS X,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:b6,righttrigger:a4,
|
||||||
|
5e04000000000000e002000000000000,Xbox Wireless Controller,platform:Mac OS X,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b10,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||||
|
79000000000000001100000000000000,Retrolink Classic Controller,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,leftshoulder:b4,rightshoulder:b5,leftx:a3,lefty:a4,platform:Mac OS X,
|
||||||
|
4c05000000000000cc09000000000000,Sony DualShock 4 V2,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b13,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Mac OS X,
|
||||||
|
5e04000000000000ea02000000000000,Xbox Wireless Controller,platform:Mac OS X,x:b2,a:b0,b:b1,y:b3,back:b9,guide:b10,start:b8,dpleft:b13,dpdown:b12,dpright:b14,dpup:b11,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b6,rightstick:b7,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||||
|
81170000000000007e05000000000000,Sega Saturn,x:b0,a:b2,b:b4,y:b6,start:b13,dpleft:b15,dpdown:b16,dpright:b14,dpup:b17,leftshoulder:b8,lefttrigger:a5,lefttrigger:b10,rightshoulder:b9,righttrigger:a4,righttrigger:b11,leftx:a0,lefty:a2,platform:Mac OS X,
|
||||||
|
bd1200000000000015d0000000000000,Tomee SNES USB Controller,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,platform:Mac OS X,
|
||||||
|
03000000632500002305000000010000,Redragon Saturn,a:b2,b:b1,x:b3,y:b0,back:b8,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Mac OS X,
|
||||||
|
|
||||||
|
# Linux
|
||||||
|
050000004c0500006802000000000000,Sony PLAYSTATION(R)3 Controller,platform:Linux,a:b14,b:b13,x:b15,y:b12,back:b0,guide:b16,start:b3,leftstick:b1,rightstick:b2,leftshoulder:b10,rightshoulder:b11,dpup:b4,dpdown:b6,dpleft:b7,dpright:b5,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a12,righttrigger:a13,
|
||||||
|
03000000ff1100004133000010010000,GreenAsia Inc.USB Joystick,platform:Linux,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a2,
|
||||||
|
0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
|
||||||
|
03000000ba2200002010000001010000,Jess Technology USB Game Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux,
|
||||||
|
030000006d04000019c2000010010000,Logitech Cordless RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
|
030000006d0400001dc2000014400000,Logitech F310 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
|
030000006d0400001ec2000020200000,Logitech F510 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
|
030000006d04000019c2000011010000,Logitech F710 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
|
030000006d0400001fc2000005030000,Logitech F710 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
|
030000004c0500006802000011010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux,
|
||||||
|
03000000451300000830000010010000,NYKO CORE,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:b6,righttrigger:b7,platform:Linux,
|
||||||
|
030000004c050000c405000011010000,Sony DualShock 4,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:b6,righttrigger:b7,platform:Linux,
|
||||||
|
030000006f0e00003001000001010000,EA Sports PS3 Controller,platform:Linux,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,
|
||||||
|
03000000de280000ff11000001000000,Valve Streaming Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
|
030000005e0400008e02000014010000,X360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
|
030000005e0400008e02000010010000,X360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
|
030000005e0400001907000000010000,X360 Wireless Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||||
|
03000000100800000100000010010000,Twin USB PS2 Adapter,a:b2,b:b1,y:b0,x:b3,start:b9,guide:,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a2,lefttrigger:b4,righttrigger:b5,platform:Linux,
|
||||||
|
03000000a306000023f6000011010000,Saitek Cyborg V.1 Game Pad,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a4,lefttrigger:b6,righttrigger:b7,platform:Linux,
|
||||||
|
030000004f04000020b3000010010000,Thrustmaster 2 in 1 DT,a:b0,b:b2,y:b3,x:b1,start:b9,guide:,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b6,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b5,righttrigger:b7,platform:Linux,
|
||||||
|
030000004f04000023b3000000010000,Thrustmaster Dual Trigger 3-in-1,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a5,
|
||||||
|
030000008f0e00000300000010010000,GreenAsia Inc. USB Joystick ,platform:Linux,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a2,
|
||||||
|
030000008f0e00001200000010010000,GreenAsia Inc. USB Joystick ,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b6,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a2,
|
||||||
|
030000005e0400009102000007010000,X360 Wireless Controller,a:b0,b:b1,y:b3,x:b2,start:b7,guide:b8,back:b6,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:b13,dpleft:b11,dpdown:b14,dpright:b12,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Linux,
|
||||||
|
030000006d04000016c2000010010000,Logitech Logitech Dual Action,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,
|
||||||
|
03000000260900008888000000010000,GameCube {WiseGroup USB box},a:b0,b:b2,y:b3,x:b1,start:b7,leftshoulder:,rightshoulder:b6,dpup:h0.1,dpleft:h0.8,rightstick:,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,platform:Linux,
|
||||||
|
030000006d04000011c2000010010000,Logitech WingMan Cordless RumblePad,a:b0,b:b1,y:b4,x:b3,start:b8,guide:b5,back:b2,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:b9,righttrigger:b10,platform:Linux,
|
||||||
|
030000006d04000018c2000010010000,Logitech Logitech RumblePad 2 USB,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,
|
||||||
|
05000000d6200000ad0d000001000000,Moga Pro,platform:Linux,a:b0,b:b1,y:b3,x:b2,start:b6,leftstick:b7,rightstick:b8,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a5,righttrigger:a4,
|
||||||
|
030000004f04000009d0000000010000,Thrustmaster Run N Drive Wireless PS3,platform:Linux,a:b1,b:b2,x:b0,y:b3,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,
|
||||||
|
030000004f04000008d0000000010000,Thrustmaster Run N Drive Wireless,platform:Linux,a:b1,b:b2,x:b0,y:b3,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:b6,righttrigger:b7,
|
||||||
|
0300000000f000000300000000010000,RetroUSB.com RetroPad,a:b1,b:b5,x:b0,y:b4,back:b2,start:b3,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,platform:Linux,
|
||||||
|
0300000000f00000f100000000010000,RetroUSB.com Super RetroPort,a:b1,b:b5,x:b0,y:b4,back:b2,start:b3,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,platform:Linux,
|
||||||
|
030000006f0e00001f01000000010000,Generic X-Box pad,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||||
|
03000000280400000140000000010000,Gravis GamePad Pro USB ,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,start:b9,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftx:a0,lefty:a1,
|
||||||
|
030000005e0400008902000021010000,Microsoft X-Box pad v2 (US),platform:Linux,x:b3,a:b0,b:b1,y:b4,back:b6,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b5,lefttrigger:a2,rightshoulder:b2,righttrigger:a5,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||||
|
030000005e0400008502000000010000,Microsoft X-Box pad (Japan),platform:Linux,x:b3,a:b0,b:b1,y:b4,back:b6,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b5,lefttrigger:a2,rightshoulder:b2,righttrigger:a5,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||||
|
030000006f0e00001e01000011010000,Rock Candy Gamepad for PS3,platform:Linux,a:b1,b:b2,x:b0,y:b3,back:b8,start:b9,guide:b12,leftshoulder:b4,rightshoulder:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,
|
||||||
|
03000000250900000500000000010000,Sony PS2 pad with SmartJoy adapter,platform:Linux,a:b2,b:b1,y:b0,x:b3,start:b8,back:b9,leftstick:b10,rightstick:b11,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b4,righttrigger:b5,
|
||||||
|
030000008916000000fd000024010000,Razer Onza Tournament,a:b0,b:b1,y:b3,x:b2,start:b7,guide:b8,back:b6,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:b13,dpleft:b11,dpdown:b14,dpright:b12,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Linux,
|
||||||
|
030000004f04000000b3000010010000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,y:b3,x:b1,start:b10,guide:b8,back:b9,leftstick:b11,rightstick:b12,leftshoulder:b4,rightshoulder:b6,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b5,righttrigger:b7,platform:Linux,
|
||||||
|
03000000ad1b000001f5000033050000,Hori Pad EX Turbo 2,a:b0,b:b1,y:b3,x:b2,start:b7,guide:b8,back:b6,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Linux,
|
||||||
|
050000004c050000c405000000010000,PS4 Controller (Bluetooth),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
|
||||||
|
060000004c0500006802000000010000,PS3 Controller (Bluetooth),a:b14,b:b13,y:b12,x:b15,start:b3,guide:b16,back:b0,leftstick:b1,rightstick:b2,leftshoulder:b10,rightshoulder:b11,dpup:b4,dpleft:b7,dpdown:b6,dpright:b5,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b8,righttrigger:b9,platform:Linux,
|
||||||
|
050000004c0500006802000000010000,PS3 Controller (Bluetooth),a:b14,b:b13,y:b12,x:b15,start:b3,guide:b16,back:b0,leftstick:b1,rightstick:b2,leftshoulder:b10,rightshoulder:b11,dpup:b4,dpleft:b7,dpdown:b6,dpright:b5,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b8,righttrigger:b9,platform:Linux,
|
||||||
|
05000000504c415953544154494f4e00,PS3 Controller (Bluetooth),a:b14,b:b13,y:b12,x:b15,start:b3,guide:b16,back:b0,leftstick:b1,rightstick:b2,leftshoulder:b10,rightshoulder:b11,dpup:b4,dpleft:b7,dpdown:b6,dpright:b5,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b8,righttrigger:b9,platform:Linux,
|
||||||
|
03000000790000000600000010010000,DragonRise Inc. Generic USB Joystick ,platform:Linux,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||||
|
03000000666600000488000000010000,Super Joy Box 5 Pro,platform:Linux,a:b2,b:b1,x:b3,y:b0,back:b9,start:b8,leftshoulder:b6,rightshoulder:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b4,righttrigger:b5,dpup:b12,dpleft:b15,dpdown:b14,dpright:b13,
|
||||||
|
05000000362800000100000002010000,OUYA Game Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,platform:Linux,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,
|
||||||
|
05000000362800000100000003010000,OUYA Game Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,platform:Linux,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,
|
||||||
|
030000008916000001fd000024010000,Razer Onza Classic Edition,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:b11,dpdown:b14,dpright:b12,dpup:b13,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||||
|
030000005e040000d102000001010000,Microsoft X-Box One pad,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||||
|
030000005e040000dd02000003020000,Microsoft X-Box One pad v2,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,platform:Linux,
|
||||||
|
03000000790000001100000010010000,RetroLink Saturn Classic Controller,platform:Linux,x:b3,a:b0,b:b1,y:b4,back:b5,guide:b2,start:b8,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,
|
||||||
|
050000007e0500003003000001000000,Nintendo Wii U Pro Controller,platform:Linux,a:b0,b:b1,x:b3,y:b2,back:b8,start:b9,guide:b10,leftshoulder:b4,rightshoulder:b5,leftstick:b11,rightstick:b12,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,dpup:b13,dpleft:b15,dpdown:b14,dpright:b16,
|
||||||
|
030000005e0400008e02000004010000,Microsoft X-Box 360 pad,platform:Linux,a:b0,b:b1,x:b2,y:b3,back:b6,start:b7,guide:b8,leftshoulder:b4,rightshoulder:b5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,
|
||||||
|
030000000d0f00002200000011010000,HORI CO. LTD. REAL ARCADE Pro.V3,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,guide:b12,start:b9,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,
|
||||||
|
030000000d0f00001000000011010000,HORI CO. LTD. FIGHTING STICK 3,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,guide:b12,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7
|
||||||
|
03000000f0250000c183000010010000,Goodbetterbest Ltd USB Controller,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,guide:b12,start:b9,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,
|
||||||
|
03000000f0250000c283000010010000,Goodbetterbest Ltd PC USB Controller,platform:Linux,a:b1,b:b2,x:b0,y:b3,back:b8,guide:b12,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7
|
||||||
|
0000000058626f782047616d65706100,Xbox Gamepad (userspace driver),platform:Linux,a:b0,b:b1,x:b2,y:b3,start:b7,back:b6,guide:b8,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftshoulder:b4,rightshoulder:b5,lefttrigger:a5,righttrigger:a4,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a2,righty:a3,
|
||||||
|
03000000ff1100003133000010010000,PC Game Controller,a:b2,b:b1,y:b0,x:b3,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Linux,
|
||||||
|
030000005e0400008e02000020200000,SpeedLink XEOX Pro Analog Gamepad pad,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||||
|
030000006f0e00001304000000010000,Generic X-Box pad,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:a0,rightstick:a3,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||||
|
03000000a306000018f5000010010000,Saitek PLC Saitek P3200 Rumble Pad,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:a2,rightshoulder:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||||
|
03000000830500006020000010010000,iBuffalo USB 2-axis 8-button Gamepad,a:b1,b:b0,x:b3,y:b2,back:b6,start:b7,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,platform:Linux,
|
||||||
|
03000000c9110000f055000011010000,HJC Game GAMEPAD,leftx:a0,lefty:a1,dpdown:h0.4,rightstick:b11,rightshoulder:b5,rightx:a2,start:b9,righty:a3,dpleft:h0.8,lefttrigger:b6,x:b2,dpup:h0.1,back:b8,leftstick:b10,leftshoulder:b4,y:b3,a:b0,dpright:h0.2,righttrigger:b7,b:b1,platform:Linux,
|
||||||
|
03000000a30600000c04000011010000,Saitek P2900 Wireless Pad,a:b1,b:b2,y:b3,x:b0,start:b12,guide:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a2,lefttrigger:b4,righttrigger:b5,platform:Linux,
|
||||||
|
03000000341a000005f7000010010000,GameCube {HuiJia USB box},a:b1,b:b2,y:b3,x:b0,start:b9,guide:,back:,leftstick:,rightstick:,leftshoulder:,dpleft:b15,dpdown:b14,dpright:b13,leftx:a0,lefty:a1,rightx:a5,righty:a2,lefttrigger:a3,righttrigger:a4,rightshoulder:b7,dpup:b12,platform:Linux,
|
||||||
|
030000006e0500000320000010010000,JC-U3613M - DirectInput Mode,platform:Linux,x:b0,a:b2,b:b3,y:b1,back:b10,guide:b12,start:b11,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,
|
||||||
|
030000006f0e00004601000001010000,Rock Candy Wired Controller for Xbox One,platform:Linux,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,guide:b8,leftstick:b9,rightstick:b10,lefttrigger:a2,righttrigger:a5,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||||
|
03000000380700001647000010040000,Mad Catz Wired Xbox 360 Controller,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||||
|
030000006f0e00003901000020060000,Afterglow Wired Controller for Xbox One,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,platform:Linux,
|
||||||
|
030000004f04000015b3000010010000,Thrustmaster Dual Analog 4,platform:Linux,a:b0,b:b2,x:b1,y:b3,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b6,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b5,righttrigger:b7,
|
||||||
|
05000000102800000900000000010000,8Bitdo SFC30 GamePad,platform:Linux,x:b4,a:b1,b:b0,y:b3,back:b10,start:b11,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,
|
||||||
|
03000000d81400000862000011010000,HitBox (PS3/PC) Analog Mode,platform:Linux,a:b1,b:b2,y:b3,x:b0,start:b12,guide:b9,back:b8,leftshoulder:b4,rightshoulder:b5,lefttrigger:b6,righttrigger:b7,leftx:a0,lefty:a1,
|
||||||
|
030000000d0f00000d00000000010000,hori,platform:Linux,a:b0,b:b6,y:b2,x:b1,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,start:b9,guide:b10,back:b8,leftshoulder:b3,rightshoulder:b7,leftx:b4,lefty:b5,
|
||||||
|
030000000d0f00006700000001010000,HORIPAD ONE,platform:Linux,a:b0,b:b1,x:b2,y:b3,back:b6,start:b7,guide:b8,leftshoulder:b4,rightshoulder:b5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,
|
||||||
|
03000000ad1b000016f0000090040000,Mad Catz Xbox 360 Controller,platform:Linux,a:b0,b:b1,y:b3,x:b2,start:b7,guide:b8,back:b6,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,
|
||||||
|
03000000d814000007cd000011010000,Toodles 2008 Chimp PC/PS3,platform:Linux,a:b0,b:b1,y:b2,x:b3,start:b9,back:b8,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,lefttrigger:b6,righttrigger:b7,
|
||||||
|
03000000fd0500000030000000010000,InterAct GoPad I-73000 (Fighting Game Layout),platform:Linux,a:b3,b:b4,y:b1,x:b0,start:b7,back:b6,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,
|
||||||
|
05000000010000000100000003000000,Nintendo Wiimote,platform:Linux,a:b0,b:b1,y:b3,x:b2,start:b9,guide:b10,back:b8,leftstick:b11,rightstick:b12,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,
|
||||||
|
030000005e0400008e02000062230000,Microsoft X-Box 360 pad,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||||
|
03000000a30600000901000000010000,Saitek P880,a:b2,b:b3,y:b1,x:b0,leftstick:b8,rightstick:b9,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a2,lefttrigger:b6,righttrigger:b7,platform:Linux,
|
||||||
|
030000006f0e00000103000000020000,Logic3 Controller,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||||
|
05000000380700006652000025010000,Mad Catz C.T.R.L.R ,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,guide:b12,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,
|
||||||
|
06000000adde0000efbe000002010000,Hidromancer Game Controller,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||||
|
03000000c01600008704000011010000,Serial/Keyboard/Mouse/Joystick,platform:Linux,a:b12,b:b10,x:b13,y:b11,back:b4,start:b5,leftstick:b14,rightstick:b15,leftshoulder:b9,rightshoulder:b8,dpup:b0,dpdown:b2,dpleft:b3,dpright:b1,leftx:a1,lefty:a0,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,
|
||||||
|
05000000a00500003232000001000000,8Bitdo Zero GamePad,platform:Linux,a:b0,b:b1,x:b3,y:b4,back:b10,start:b11,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,
|
||||||
|
03000000780000000600000010010000,Microntek USB Joystick,platform:Linux,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,leftx:a0,lefty:a1,
|
||||||
|
03000000ad1b00002ef0000090040000,Mad Catz Fightpad SFxT,platform:Linux,a:b0,b:b1,y:b3,x:b2,start:b7,guide:b8,back:b6,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,lefttrigger:a2,righttrigger:a5,
|
||||||
|
03000000100800000300000010010000,USB Gamepad,platform:Linux,a:b2,b:b1,x:b3,y:b0,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a2,lefttrigger:b4,righttrigger:b5,
|
||||||
|
030000005e0400008e02000073050000,Speedlink TORID Wireless Gamepad,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||||
|
030000001008000001e5000010010000,NEXT Classic USB Game Controller,a:b0,b:b1,back:b8,start:b9,rightx:a2,righty:a3,leftx:a0,lefty:a1,platform:Linux,
|
||||||
|
030000006d04000016c2000011010000,Logitech F310 Gamepad (DInput),x:b0,a:b1,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,platform:Linux,
|
||||||
|
03000000bd12000015d0000010010000,Tomee SNES USB Controller,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,platform:Linux,
|
||||||
|
050000004c050000cc09000000010000,Sony DualShock 4 V2 BT,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b13,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Linux,
|
||||||
|
030000004c050000a00b000011010000,Sony DualShock 4 Wireless Adaptor,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b13,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Linux,
|
||||||
|
05000000ac0500003232000001000000,VR-BOX,platform:Linux,a:b0,b:b1,x:b2,y:b3,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a2,lefttrigger:b4,righttrigger:b5,
|
||||||
|
030000004c050000cc09000011010000,Sony DualShock 4 V2,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Linux,
|
||||||
|
030000004c050000cc09000011810000,Sony Interactive Entertainment Wireless Controller,platform:Linux,x:b3,a:b0,b:b1,y:b2,back:b8,guide:b10,start:b9,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:a2,rightshoulder:b6,rightshoulder:b5,righttrigger:a5,leftstick:b7,leftstick:b11,rightstick:b12,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||||
|
050000004c050000cc09000000810000,Wireless Controller,platform:Linux,x:b3,a:b0,b:b1,y:b2,back:b8,guide:b10,start:b9,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:a2,rightshoulder:b6,rightshoulder:b5,righttrigger:a5,leftstick:b7,leftstick:b11,rightstick:b12,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||||
|
030000004c0500006802000011810000,Sony PLAYSTATION(R)3 Controller,platform:Linux,x:b3,a:b0,b:b1,y:b2,back:b8,guide:b10,start:b9,dpleft:b15,dpdown:b14,dpright:b16,dpup:b13,leftshoulder:b4,lefttrigger:a2,rightshoulder:b6,rightshoulder:b5,righttrigger:a5,leftstick:b7,leftstick:b11,rightstick:b12,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||||
|
050000004c0500006802000000810000,PLAYSTATION(R)3 Controller,platform:Linux,x:b3,a:b0,b:b1,y:b2,back:b8,guide:b10,start:b9,dpleft:b15,dpdown:b14,dpright:b16,dpup:b13,leftshoulder:b4,lefttrigger:a2,rightshoulder:b6,rightshoulder:b5,righttrigger:a5,leftstick:b7,leftstick:b11,rightstick:b12,leftx:a0,lefty:a1,rightx:a3,righty:a4,
|
||||||
|
03000000c82d00000190000011010000,8Bitdo NES30 Pro 8Bitdo NES30 Pro,platform:Linux,a:b1,b:b0,x:b4,y:b3,back:b10,start:b11,leftstick:b13,rightstick:b14,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,
|
||||||
|
05000000c82d00002038000000010000,8Bitdo NES30 Pro,platform:Linux,a:b1,b:b0,x:b4,y:b3,back:b10,guide:b2,start:b11,leftstick:b13,rightstick:b14,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a5,righttrigger:a4,
|
||||||
|
030000005e040000a102000000010000,Xbox 360 Wireless Receiver,platform:Linux,a:b0,b:b1,x:b2,y:b3,back:b6,guide:b8,start:b7,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:b13,dpdown:b14,dpleft:b11,dpright:b12,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,
|
||||||
|
050000004c050000cc09000001000000,Sony DualShock 4 V2 BT,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Linux,
|
||||||
|
03000000bc2000006412000011010000,BETOP CONTROLLER,a:b2,b:b1,y:b0,x:b3,start:b9,guide:b30,back:b8,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftshoulder:b4,rightshoulder:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Linux,
|
||||||
|
05000000c82d00000161000000010000,8Bitdo SN30 Pro,platform:Linux,a:b1,b:b0,x:b4,y:b3,back:b10,guide:b2,start:b11,leftstick:b13,rightstick:b14,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a5,righttrigger:a4,
|
||||||
|
03000000380700008532000010010000,MadCatz Madcatz Fightpad,platform:Linux,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftshoulder:b4,rightshoulder:b6,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,lefttrigger:b5,righttrigger:b7,
|
||||||
|
030000000d0f0000ee00000011010000,HORI CO.,LTD. HORIPAD mini4,platform:Linux,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,
|
||||||
|
030000000d0f0000c100000011010000,HORI CO.,LTD. HORIPAD S,platform:Linux,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,
|
||||||
|
03000000ad1b000003f5000033050000,Hori Fighting Stick VX,platform:Linux,a:b0,b:b1,x:b2,y:b3,back:b8,guide:b10,start:b9,leftshoulder:b4,rightshoulder:b5,-leftx:h0.8,+leftx:h0.2,-lefty:h0.1,+lefty:h0.4,lefttrigger:b6,righttrigger:b7,
|
||||||
|
03000000c82d00000260000011010000,8Bitdo SF30 Pro 8BitDo SN30 Pro+,platform:Linux,a:b1,b:b0,x:b4,y:b3,back:b10,guide:b2,start:b11,leftstick:b13,rightstick:b14,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a5,righttrigger:a4,
|
||||||
|
060000007e0500000820000000000000,Nintendo Switch Combined Joy-Cons,platform:Linux,a:b0,b:b1,x:b3,y:b2,back:b9,guide:b11,start:b10,leftstick:b12,rightstick:b13,leftshoulder:b5,rightshoulder:b6,dpup:b14,dpdown:b15,dpleft:b16,dpright:b17,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b7,righttrigger:b8,
|
@ -52,7 +52,6 @@ CAnimBlendHierarchy::RemoveQuaternionFlips(void)
|
|||||||
void
|
void
|
||||||
CAnimBlendHierarchy::RemoveAnimSequences(void)
|
CAnimBlendHierarchy::RemoveAnimSequences(void)
|
||||||
{
|
{
|
||||||
if(sequences)
|
|
||||||
delete[] sequences;
|
delete[] sequences;
|
||||||
numSequences = 0;
|
numSequences = 0;
|
||||||
}
|
}
|
||||||
|
@ -15,7 +15,7 @@ public:
|
|||||||
char name[24];
|
char name[24];
|
||||||
CAnimBlendSequence *sequences;
|
CAnimBlendSequence *sequences;
|
||||||
int16 numSequences;
|
int16 numSequences;
|
||||||
int16 compressed; // not really used
|
int16 compressed;
|
||||||
float totalLength;
|
float totalLength;
|
||||||
CLink<CAnimBlendHierarchy*> *linkPtr;
|
CLink<CAnimBlendHierarchy*> *linkPtr;
|
||||||
|
|
||||||
|
@ -16,9 +16,10 @@ CAnimBlendSequence::CAnimBlendSequence(void)
|
|||||||
|
|
||||||
CAnimBlendSequence::~CAnimBlendSequence(void)
|
CAnimBlendSequence::~CAnimBlendSequence(void)
|
||||||
{
|
{
|
||||||
assert(keyFramesCompressed == nil);
|
|
||||||
if(keyFrames)
|
if(keyFrames)
|
||||||
RwFree(keyFrames);
|
RwFree(keyFrames);
|
||||||
|
if(keyFramesCompressed)
|
||||||
|
RwFree(keyFramesCompressed);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -841,54 +841,57 @@ CAnimManager::LoadAnimFile(int fd, bool compress)
|
|||||||
ROUNDSIZE(anim.size);
|
ROUNDSIZE(anim.size);
|
||||||
CFileMgr::Read(fd, buf, anim.size);
|
CFileMgr::Read(fd, buf, anim.size);
|
||||||
int numFrames = *(int*)(buf+28);
|
int numFrames = *(int*)(buf+28);
|
||||||
|
seq->SetName(buf);
|
||||||
#ifdef PED_SKIN
|
#ifdef PED_SKIN
|
||||||
if(anim.size == 44)
|
if(anim.size == 44)
|
||||||
seq->SetBoneTag(*(int*)(buf+40));
|
seq->SetBoneTag(*(int*)(buf+40));
|
||||||
#endif
|
#endif
|
||||||
seq->SetName(buf);
|
|
||||||
if(numFrames == 0)
|
if(numFrames == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
bool hasScale = false;
|
||||||
|
bool hasTranslation = false;
|
||||||
CFileMgr::Read(fd, (char*)&info, sizeof(info));
|
CFileMgr::Read(fd, (char*)&info, sizeof(info));
|
||||||
if(strncmp(info.ident, "KR00", 4) == 0){
|
if(strncmp(info.ident, "KRTS", 4) == 0){
|
||||||
seq->SetNumFrames(numFrames, false);
|
hasScale = true;
|
||||||
KeyFrame *kf = seq->GetKeyFrame(0);
|
seq->SetNumFrames(numFrames, true);
|
||||||
for(l = 0; l < numFrames; l++, kf++){
|
|
||||||
CFileMgr::Read(fd, buf, 0x14);
|
|
||||||
kf->rotation.x = -fbuf[0];
|
|
||||||
kf->rotation.y = -fbuf[1];
|
|
||||||
kf->rotation.z = -fbuf[2];
|
|
||||||
kf->rotation.w = fbuf[3];
|
|
||||||
kf->deltaTime = fbuf[4]; // absolute time here
|
|
||||||
}
|
|
||||||
}else if(strncmp(info.ident, "KRT0", 4) == 0){
|
}else if(strncmp(info.ident, "KRT0", 4) == 0){
|
||||||
|
hasTranslation = true;
|
||||||
seq->SetNumFrames(numFrames, true);
|
seq->SetNumFrames(numFrames, true);
|
||||||
KeyFrameTrans *kf = (KeyFrameTrans*)seq->GetKeyFrame(0);
|
}else if(strncmp(info.ident, "KR00", 4) == 0){
|
||||||
for(l = 0; l < numFrames; l++, kf++){
|
seq->SetNumFrames(numFrames, false);
|
||||||
CFileMgr::Read(fd, buf, 0x20);
|
|
||||||
kf->rotation.x = -fbuf[0];
|
|
||||||
kf->rotation.y = -fbuf[1];
|
|
||||||
kf->rotation.z = -fbuf[2];
|
|
||||||
kf->rotation.w = fbuf[3];
|
|
||||||
kf->translation.x = fbuf[4];
|
|
||||||
kf->translation.y = fbuf[5];
|
|
||||||
kf->translation.z = fbuf[6];
|
|
||||||
kf->deltaTime = fbuf[7]; // absolute time here
|
|
||||||
}
|
}
|
||||||
}else if(strncmp(info.ident, "KRTS", 4) == 0){
|
|
||||||
seq->SetNumFrames(numFrames, true);
|
for(l = 0; l < numFrames; l++){
|
||||||
KeyFrameTrans *kf = (KeyFrameTrans*)seq->GetKeyFrame(0);
|
if(hasScale){
|
||||||
for(l = 0; l < numFrames; l++, kf++){
|
|
||||||
CFileMgr::Read(fd, buf, 0x2C);
|
CFileMgr::Read(fd, buf, 0x2C);
|
||||||
kf->rotation.x = -fbuf[0];
|
CQuaternion rot(fbuf[0], fbuf[1], fbuf[2], fbuf[3]);
|
||||||
kf->rotation.y = -fbuf[1];
|
rot.Invert();
|
||||||
kf->rotation.z = -fbuf[2];
|
CVector trans(fbuf[4], fbuf[5], fbuf[6]);
|
||||||
kf->rotation.w = fbuf[3];
|
|
||||||
kf->translation.x = fbuf[4];
|
KeyFrameTrans *kf = (KeyFrameTrans*)seq->GetKeyFrame(l);
|
||||||
kf->translation.y = fbuf[5];
|
kf->rotation = rot;
|
||||||
kf->translation.z = fbuf[6];
|
kf->translation = trans;
|
||||||
// scaling ignored
|
// scaling ignored
|
||||||
kf->deltaTime = fbuf[10]; // absolute time here
|
kf->deltaTime = fbuf[10]; // absolute time here
|
||||||
|
}else if(hasTranslation){
|
||||||
|
CFileMgr::Read(fd, buf, 0x20);
|
||||||
|
CQuaternion rot(fbuf[0], fbuf[1], fbuf[2], fbuf[3]);
|
||||||
|
rot.Invert();
|
||||||
|
CVector trans(fbuf[4], fbuf[5], fbuf[6]);
|
||||||
|
|
||||||
|
KeyFrameTrans *kf = (KeyFrameTrans*)seq->GetKeyFrame(l);
|
||||||
|
kf->rotation = rot;
|
||||||
|
kf->translation = trans;
|
||||||
|
kf->deltaTime = fbuf[7]; // absolute time here
|
||||||
|
}else{
|
||||||
|
CFileMgr::Read(fd, buf, 0x14);
|
||||||
|
CQuaternion rot(fbuf[0], fbuf[1], fbuf[2], fbuf[3]);
|
||||||
|
rot.Invert();
|
||||||
|
|
||||||
|
KeyFrame *kf = (KeyFrame*)seq->GetKeyFrame(l);
|
||||||
|
kf->rotation = rot;
|
||||||
|
kf->deltaTime = fbuf[4]; // absolute time here
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
#include "AnimBlendClumpData.h"
|
#include "AnimBlendClumpData.h"
|
||||||
#include "AnimBlendHierarchy.h"
|
#include "AnimBlendHierarchy.h"
|
||||||
#include "AnimBlendAssociation.h"
|
#include "AnimBlendAssociation.h"
|
||||||
|
#include "AnimManager.h"
|
||||||
#include "RpAnimBlend.h"
|
#include "RpAnimBlend.h"
|
||||||
#ifdef PED_SKIN
|
#ifdef PED_SKIN
|
||||||
#include "PedModelInfo.h"
|
#include "PedModelInfo.h"
|
||||||
@ -441,7 +442,7 @@ RpAnimBlendClumpUpdateAnimations(RpClump *clump, float timeDelta)
|
|||||||
next = link->next;
|
next = link->next;
|
||||||
CAnimBlendAssociation *assoc = CAnimBlendAssociation::FromLink(link);
|
CAnimBlendAssociation *assoc = CAnimBlendAssociation::FromLink(link);
|
||||||
if(assoc->UpdateBlend(timeDelta)){
|
if(assoc->UpdateBlend(timeDelta)){
|
||||||
// CAnimManager::UncompressAnimation(v6->hierarchy)
|
CAnimManager::UncompressAnimation(assoc->hierarchy);
|
||||||
updateData.nodes[i++] = assoc->GetNode(0);
|
updateData.nodes[i++] = assoc->GetNode(0);
|
||||||
if(assoc->flags & ASSOC_MOVEMENT){
|
if(assoc->flags & ASSOC_MOVEMENT){
|
||||||
totalLength += assoc->hierarchy->totalLength/assoc->speed * assoc->blendAmount;
|
totalLength += assoc->hierarchy->totalLength/assoc->speed * assoc->blendAmount;
|
||||||
|
@ -52,8 +52,8 @@ uint32 gHomeNextTime;
|
|||||||
uint32 gCellNextTime;
|
uint32 gCellNextTime;
|
||||||
uint32 gNextCryTime;
|
uint32 gNextCryTime;
|
||||||
|
|
||||||
enum PLAY_STATUS : uint8 { PLAY_STATUS_STOPPED = 0, PLAY_STATUS_PLAYING, PLAY_STATUS_FINISHED };
|
enum PLAY_STATUS { PLAY_STATUS_STOPPED = 0, PLAY_STATUS_PLAYING, PLAY_STATUS_FINISHED };
|
||||||
enum LOADING_STATUS : uint8 { LOADING_STATUS_NOT_LOADED = 0, LOADING_STATUS_LOADED, LOADING_STATUS_FAILED };
|
enum LOADING_STATUS { LOADING_STATUS_NOT_LOADED = 0, LOADING_STATUS_LOADED, LOADING_STATUS_FAILED };
|
||||||
|
|
||||||
void
|
void
|
||||||
cAudioManager::PreInitialiseGameSpecificSetup() const
|
cAudioManager::PreInitialiseGameSpecificSetup() const
|
||||||
@ -8121,7 +8121,7 @@ cAudioManager::ProcessGarages()
|
|||||||
const float SOUND_INTENSITY = 80.0f;
|
const float SOUND_INTENSITY = 80.0f;
|
||||||
|
|
||||||
CEntity *entity;
|
CEntity *entity;
|
||||||
eGarageState state;
|
uint8 state;
|
||||||
uint32 sampleIndex;
|
uint32 sampleIndex;
|
||||||
uint8 j;
|
uint8 j;
|
||||||
float distSquared;
|
float distSquared;
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
enum eSfxSample : uint32
|
enum eSfxSample
|
||||||
{
|
{
|
||||||
SFX_CAR_HORN_JEEP = 0,
|
SFX_CAR_HORN_JEEP = 0,
|
||||||
SFX_CAR_HORN_BMW328,
|
SFX_CAR_HORN_BMW328,
|
||||||
|
@ -235,7 +235,7 @@ enum AudioEntityHandle {
|
|||||||
AEHANDLE_ERROR_BADAUDIOTYPE = -1,
|
AEHANDLE_ERROR_BADAUDIOTYPE = -1,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum eAudioType : int32
|
enum eAudioType
|
||||||
{
|
{
|
||||||
AUDIOTYPE_PHYSICAL = 0,
|
AUDIOTYPE_PHYSICAL = 0,
|
||||||
AUDIOTYPE_EXPLOSION,
|
AUDIOTYPE_EXPLOSION,
|
||||||
|
@ -3,6 +3,14 @@
|
|||||||
|
|
||||||
#ifdef AUDIO_OAL
|
#ifdef AUDIO_OAL
|
||||||
|
|
||||||
|
/*
|
||||||
|
* When linking to a static openal-soft library,
|
||||||
|
* the extension function inside the openal library conflict with the variables here.
|
||||||
|
* Therefore declare these re3 owned symbols in a private namespace.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace re3_openal {
|
||||||
|
|
||||||
LPALGENEFFECTS alGenEffects;
|
LPALGENEFFECTS alGenEffects;
|
||||||
LPALDELETEEFFECTS alDeleteEffects;
|
LPALDELETEEFFECTS alDeleteEffects;
|
||||||
LPALISEFFECT alIsEffect;
|
LPALISEFFECT alIsEffect;
|
||||||
@ -37,6 +45,9 @@ LPALGETFILTERIV alGetFilteriv;
|
|||||||
LPALGETFILTERF alGetFilterf;
|
LPALGETFILTERF alGetFilterf;
|
||||||
LPALGETFILTERFV alGetFilterfv;
|
LPALGETFILTERFV alGetFilterfv;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
using namespace re3_openal;
|
||||||
|
|
||||||
void EFXInit()
|
void EFXInit()
|
||||||
{
|
{
|
||||||
|
@ -11,6 +11,8 @@ void EFX_Set(ALuint effect, const EAXLISTENERPROPERTIES *props);
|
|||||||
void EAX3_SetReverbMix(ALuint filter, float mix);
|
void EAX3_SetReverbMix(ALuint filter, float mix);
|
||||||
void SetEffectsLevel(ALuint uiFilter, float level);
|
void SetEffectsLevel(ALuint uiFilter, float level);
|
||||||
|
|
||||||
|
namespace re3_openal {
|
||||||
|
|
||||||
extern LPALGENEFFECTS alGenEffects;
|
extern LPALGENEFFECTS alGenEffects;
|
||||||
extern LPALDELETEEFFECTS alDeleteEffects;
|
extern LPALDELETEEFFECTS alDeleteEffects;
|
||||||
extern LPALISEFFECT alIsEffect;
|
extern LPALISEFFECT alIsEffect;
|
||||||
@ -44,4 +46,9 @@ extern LPALGETFILTERI alGetFilteri;
|
|||||||
extern LPALGETFILTERIV alGetFilteriv;
|
extern LPALGETFILTERIV alGetFilteriv;
|
||||||
extern LPALGETFILTERF alGetFilterf;
|
extern LPALGETFILTERF alGetFilterf;
|
||||||
extern LPALGETFILTERFV alGetFilterfv;
|
extern LPALGETFILTERFV alGetFilterfv;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
using namespace re3_openal;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
enum eSound : uint16
|
enum eSound
|
||||||
{
|
{
|
||||||
SOUND_CAR_DOOR_CLOSE_BONNET = 0,
|
SOUND_CAR_DOOR_CLOSE_BONNET = 0,
|
||||||
SOUND_CAR_DOOR_CLOSE_BUMPER,
|
SOUND_CAR_DOOR_CLOSE_BUMPER,
|
||||||
@ -173,7 +173,7 @@ enum eSound : uint16
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
enum eScriptSounds : uint16 {
|
enum eScriptSounds {
|
||||||
SCRIPT_SOUND_0 = 0,
|
SCRIPT_SOUND_0 = 0,
|
||||||
SCRIPT_SOUND_1,
|
SCRIPT_SOUND_1,
|
||||||
SCRIPT_SOUND_2,
|
SCRIPT_SOUND_2,
|
||||||
|
@ -665,7 +665,7 @@ CCollision::TestLineOfSight(const CColLine &line, const CMatrix &matrix, CColMod
|
|||||||
// transform line to model space
|
// transform line to model space
|
||||||
Invert(matrix, matTransform);
|
Invert(matrix, matTransform);
|
||||||
CVuVector newline[2];
|
CVuVector newline[2];
|
||||||
TransformPoints(newline, 2, matTransform, (RwV3d*)&line.p0, sizeof(CColLine)/2);
|
TransformPoints(newline, 2, matTransform, &line.p0, sizeof(CColLine)/2);
|
||||||
|
|
||||||
// If we don't intersect with the bounding box, no chance on the rest
|
// If we don't intersect with the bounding box, no chance on the rest
|
||||||
if(!TestLineBox(*(CColLine*)newline, model.boundingBox))
|
if(!TestLineBox(*(CColLine*)newline, model.boundingBox))
|
||||||
@ -1474,7 +1474,7 @@ CCollision::ProcessLineOfSight(const CColLine &line,
|
|||||||
// transform line to model space
|
// transform line to model space
|
||||||
Invert(matrix, matTransform);
|
Invert(matrix, matTransform);
|
||||||
CVuVector newline[2];
|
CVuVector newline[2];
|
||||||
TransformPoints(newline, 2, matTransform, (RwV3d*)&line.p0, sizeof(CColLine)/2);
|
TransformPoints(newline, 2, matTransform, &line.p0, sizeof(CColLine)/2);
|
||||||
|
|
||||||
if(mindist < 1.0f)
|
if(mindist < 1.0f)
|
||||||
newline[1] = newline[0] + (newline[1] - newline[0])*mindist;
|
newline[1] = newline[0] + (newline[1] - newline[0])*mindist;
|
||||||
@ -1606,7 +1606,7 @@ CCollision::ProcessVerticalLine(const CColLine &line,
|
|||||||
// transform line to model space
|
// transform line to model space
|
||||||
Invert(matrix, matTransform);
|
Invert(matrix, matTransform);
|
||||||
CVuVector newline[2];
|
CVuVector newline[2];
|
||||||
TransformPoints(newline, 2, matTransform, (RwV3d*)&line.p0, sizeof(CColLine)/2);
|
TransformPoints(newline, 2, matTransform, &line.p0, sizeof(CColLine)/2);
|
||||||
|
|
||||||
if(mindist < 1.0f)
|
if(mindist < 1.0f)
|
||||||
newline[1] = newline[0] + (newline[1] - newline[0])*mindist;
|
newline[1] = newline[0] + (newline[1] - newline[0])*mindist;
|
||||||
@ -1806,16 +1806,16 @@ CCollision::ProcessColModels(const CMatrix &matrixA, CColModel &modelA,
|
|||||||
matAB *= matrixA;
|
matAB *= matrixA;
|
||||||
|
|
||||||
CVuVector bsphereAB; // bounding sphere of A in B space
|
CVuVector bsphereAB; // bounding sphere of A in B space
|
||||||
TransformPoint(bsphereAB, matAB, *(RwV3d*)modelA.boundingSphere.center); // inlined
|
TransformPoint(bsphereAB, matAB, modelA.boundingSphere.center); // inlined
|
||||||
bsphereAB.w = modelA.boundingSphere.radius;
|
bsphereAB.w = modelA.boundingSphere.radius;
|
||||||
if(!TestSphereBox(*(CColSphere*)&bsphereAB, modelB.boundingBox))
|
if(!TestSphereBox(*(CColSphere*)&bsphereAB, modelB.boundingBox))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
// transform modelA's spheres and lines to B space
|
// transform modelA's spheres and lines to B space
|
||||||
TransformPoints(aSpheresA, modelA.numSpheres, matAB, (RwV3d*)&modelA.spheres->center, sizeof(CColSphere));
|
TransformPoints(aSpheresA, modelA.numSpheres, matAB, &modelA.spheres->center, sizeof(CColSphere));
|
||||||
for(i = 0; i < modelA.numSpheres; i++)
|
for(i = 0; i < modelA.numSpheres; i++)
|
||||||
aSpheresA[i].w = modelA.spheres[i].radius;
|
aSpheresA[i].w = modelA.spheres[i].radius;
|
||||||
TransformPoints(aLinesA, modelA.numLines*2, matAB, (RwV3d*)&modelA.lines->p0, sizeof(CColLine)/2);
|
TransformPoints(aLinesA, modelA.numLines*2, matAB, &modelA.lines->p0, sizeof(CColLine)/2);
|
||||||
|
|
||||||
// Test them against model B's bounding volumes
|
// Test them against model B's bounding volumes
|
||||||
int numSpheresA = 0;
|
int numSpheresA = 0;
|
||||||
@ -1832,7 +1832,7 @@ CCollision::ProcessColModels(const CMatrix &matrixA, CColModel &modelA,
|
|||||||
matBA *= matrixB;
|
matBA *= matrixB;
|
||||||
|
|
||||||
// transform modelB's spheres to A space
|
// transform modelB's spheres to A space
|
||||||
TransformPoints(aSpheresB, modelB.numSpheres, matBA, (RwV3d*)&modelB.spheres->center, sizeof(CColSphere));
|
TransformPoints(aSpheresB, modelB.numSpheres, matBA, &modelB.spheres->center, sizeof(CColSphere));
|
||||||
for(i = 0; i < modelB.numSpheres; i++)
|
for(i = 0; i < modelB.numSpheres; i++)
|
||||||
aSpheresB[i].w = modelB.spheres[i].radius;
|
aSpheresB[i].w = modelB.spheres[i].radius;
|
||||||
|
|
||||||
|
@ -103,9 +103,9 @@ void CAutoPilot::Load(uint8*& buf)
|
|||||||
m_nNextDirection = ReadSaveBuf<int8>(buf);
|
m_nNextDirection = ReadSaveBuf<int8>(buf);
|
||||||
m_nCurrentLane = ReadSaveBuf<int8>(buf);
|
m_nCurrentLane = ReadSaveBuf<int8>(buf);
|
||||||
m_nNextLane = ReadSaveBuf<int8>(buf);
|
m_nNextLane = ReadSaveBuf<int8>(buf);
|
||||||
m_nDrivingStyle = (eCarDrivingStyle)ReadSaveBuf<uint8>(buf);
|
m_nDrivingStyle = ReadSaveBuf<uint8>(buf);
|
||||||
m_nCarMission = (eCarMission)ReadSaveBuf<uint8>(buf);
|
m_nCarMission = ReadSaveBuf<uint8>(buf);
|
||||||
m_nTempAction = (eCarTempAction)ReadSaveBuf<uint8>(buf);
|
m_nTempAction = ReadSaveBuf<uint8>(buf);
|
||||||
m_nTimeTempAction = ReadSaveBuf<uint32>(buf);
|
m_nTimeTempAction = ReadSaveBuf<uint32>(buf);
|
||||||
m_fMaxTrafficSpeed = ReadSaveBuf<float>(buf);
|
m_fMaxTrafficSpeed = ReadSaveBuf<float>(buf);
|
||||||
m_nCruiseSpeed = ReadSaveBuf<uint8>(buf);
|
m_nCruiseSpeed = ReadSaveBuf<uint8>(buf);
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
class CVehicle;
|
class CVehicle;
|
||||||
struct CPathNode;
|
struct CPathNode;
|
||||||
|
|
||||||
enum eCarMission : uint8
|
enum eCarMission
|
||||||
{
|
{
|
||||||
MISSION_NONE,
|
MISSION_NONE,
|
||||||
MISSION_CRUISE,
|
MISSION_CRUISE,
|
||||||
@ -28,7 +28,7 @@ enum eCarMission : uint8
|
|||||||
MISSION_BLOCKCAR_HANDBRAKESTOP,
|
MISSION_BLOCKCAR_HANDBRAKESTOP,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum eCarTempAction : uint8
|
enum eCarTempAction
|
||||||
{
|
{
|
||||||
TEMPACT_NONE,
|
TEMPACT_NONE,
|
||||||
TEMPACT_WAIT,
|
TEMPACT_WAIT,
|
||||||
@ -43,7 +43,7 @@ enum eCarTempAction : uint8
|
|||||||
TEMPACT_SWERVERIGHT
|
TEMPACT_SWERVERIGHT
|
||||||
};
|
};
|
||||||
|
|
||||||
enum eCarDrivingStyle : uint8
|
enum eCarDrivingStyle
|
||||||
{
|
{
|
||||||
DRIVINGSTYLE_STOP_FOR_CARS,
|
DRIVINGSTYLE_STOP_FOR_CARS,
|
||||||
DRIVINGSTYLE_SLOW_DOWN_FOR_CARS,
|
DRIVINGSTYLE_SLOW_DOWN_FOR_CARS,
|
||||||
@ -69,9 +69,9 @@ public:
|
|||||||
int8 m_nNextDirection;
|
int8 m_nNextDirection;
|
||||||
int8 m_nCurrentLane;
|
int8 m_nCurrentLane;
|
||||||
int8 m_nNextLane;
|
int8 m_nNextLane;
|
||||||
eCarDrivingStyle m_nDrivingStyle;
|
uint8 m_nDrivingStyle;
|
||||||
eCarMission m_nCarMission;
|
uint8 m_nCarMission;
|
||||||
eCarTempAction m_nTempAction;
|
uint8 m_nTempAction;
|
||||||
uint32 m_nTimeTempAction;
|
uint32 m_nTimeTempAction;
|
||||||
float m_fMaxTrafficSpeed;
|
float m_fMaxTrafficSpeed;
|
||||||
uint8 m_nCruiseSpeed;
|
uint8 m_nCruiseSpeed;
|
||||||
|
@ -539,7 +539,7 @@ void CCarAI::TellCarToBlockOtherCar(CVehicle* pVehicle, CVehicle* pTarget)
|
|||||||
pVehicle->AutoPilot.m_nCruiseSpeed = Max(6, pVehicle->AutoPilot.m_nCruiseSpeed);
|
pVehicle->AutoPilot.m_nCruiseSpeed = Max(6, pVehicle->AutoPilot.m_nCruiseSpeed);
|
||||||
}
|
}
|
||||||
|
|
||||||
eCarMission CCarAI::FindPoliceCarMissionForWantedLevel()
|
uint8 CCarAI::FindPoliceCarMissionForWantedLevel()
|
||||||
{
|
{
|
||||||
switch (CWorld::Players[CWorld::PlayerInFocus].m_pPed->m_pWanted->m_nWantedLevel){
|
switch (CWorld::Players[CWorld::PlayerInFocus].m_pPed->m_pWanted->m_nWantedLevel){
|
||||||
case 0:
|
case 0:
|
||||||
|
@ -19,7 +19,7 @@ public:
|
|||||||
static void TellOccupantsToLeaveCar(CVehicle*);
|
static void TellOccupantsToLeaveCar(CVehicle*);
|
||||||
static void TellCarToRamOtherCar(CVehicle*, CVehicle*);
|
static void TellCarToRamOtherCar(CVehicle*, CVehicle*);
|
||||||
static void TellCarToBlockOtherCar(CVehicle*, CVehicle*);
|
static void TellCarToBlockOtherCar(CVehicle*, CVehicle*);
|
||||||
static eCarMission FindPoliceCarMissionForWantedLevel();
|
static uint8 FindPoliceCarMissionForWantedLevel();
|
||||||
static int32 FindPoliceCarSpeedForWantedLevel(CVehicle*);
|
static int32 FindPoliceCarSpeedForWantedLevel(CVehicle*);
|
||||||
static void MellowOutChaseSpeed(CVehicle*);
|
static void MellowOutChaseSpeed(CVehicle*);
|
||||||
static void MakeWayForCarWithSiren(CVehicle *veh);
|
static void MakeWayForCarWithSiren(CVehicle *veh);
|
||||||
|
@ -408,11 +408,6 @@ CCarCtrl::GenerateOneRandomCar()
|
|||||||
float directionNextLinkX;
|
float directionNextLinkX;
|
||||||
float directionNextLinkY;
|
float directionNextLinkY;
|
||||||
if (positionBetweenNodes < 0.5f) {
|
if (positionBetweenNodes < 0.5f) {
|
||||||
float currentPathLinkForwardX = pVehicle->AutoPilot.m_nCurrentDirection * ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nCurrentPathNodeInfo].GetDirX();
|
|
||||||
float currentPathLinkForwardY = pVehicle->AutoPilot.m_nCurrentDirection * ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nCurrentPathNodeInfo].GetDirY();
|
|
||||||
float nextPathLinkForwardX = pVehicle->AutoPilot.m_nNextDirection * ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nNextPathNodeInfo].GetDirX();
|
|
||||||
float nextPathLinkForwardY = pVehicle->AutoPilot.m_nNextDirection * ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nNextPathNodeInfo].GetDirY();
|
|
||||||
|
|
||||||
pCurrentLink = &ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nCurrentPathNodeInfo];
|
pCurrentLink = &ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nCurrentPathNodeInfo];
|
||||||
pNextLink = &ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nNextPathNodeInfo];
|
pNextLink = &ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nNextPathNodeInfo];
|
||||||
positionOnCurrentLinkIncludingLane = CVector(
|
positionOnCurrentLinkIncludingLane = CVector(
|
||||||
@ -442,11 +437,6 @@ CCarCtrl::GenerateOneRandomCar()
|
|||||||
pVehicle->AutoPilot.m_nTimeEnteredCurve = CTimer::GetTimeInMilliseconds() -
|
pVehicle->AutoPilot.m_nTimeEnteredCurve = CTimer::GetTimeInMilliseconds() -
|
||||||
(uint32)((positionBetweenNodes - 0.5f) * pVehicle->AutoPilot.m_nTimeToSpendOnCurrentCurve);
|
(uint32)((positionBetweenNodes - 0.5f) * pVehicle->AutoPilot.m_nTimeToSpendOnCurrentCurve);
|
||||||
|
|
||||||
float currentPathLinkForwardX = pVehicle->AutoPilot.m_nCurrentDirection * ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nCurrentPathNodeInfo].GetDirX();
|
|
||||||
float currentPathLinkForwardY = pVehicle->AutoPilot.m_nCurrentDirection * ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nCurrentPathNodeInfo].GetDirY();
|
|
||||||
float nextPathLinkForwardX = pVehicle->AutoPilot.m_nNextDirection * ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nNextPathNodeInfo].GetDirX();
|
|
||||||
float nextPathLinkForwardY = pVehicle->AutoPilot.m_nNextDirection * ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nNextPathNodeInfo].GetDirY();
|
|
||||||
|
|
||||||
pCurrentLink = &ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nCurrentPathNodeInfo];
|
pCurrentLink = &ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nCurrentPathNodeInfo];
|
||||||
pNextLink = &ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nNextPathNodeInfo];
|
pNextLink = &ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nNextPathNodeInfo];
|
||||||
positionOnCurrentLinkIncludingLane = CVector(
|
positionOnCurrentLinkIncludingLane = CVector(
|
||||||
@ -2348,7 +2338,11 @@ void CCarCtrl::SteerAICarWithPhysicsFollowPath(CVehicle* pVehicle, float* pSwerv
|
|||||||
switch (pVehicle->AutoPilot.m_nDrivingStyle) {
|
switch (pVehicle->AutoPilot.m_nDrivingStyle) {
|
||||||
case DRIVINGSTYLE_STOP_FOR_CARS:
|
case DRIVINGSTYLE_STOP_FOR_CARS:
|
||||||
case DRIVINGSTYLE_SLOW_DOWN_FOR_CARS:
|
case DRIVINGSTYLE_SLOW_DOWN_FOR_CARS:
|
||||||
speedStyleMultiplier = FindMaximumSpeedForThisCarInTraffic(pVehicle) / pVehicle->AutoPilot.m_nCruiseSpeed;
|
speedStyleMultiplier = FindMaximumSpeedForThisCarInTraffic(pVehicle);
|
||||||
|
#ifdef FIX_BUGS
|
||||||
|
if (pVehicle->AutoPilot.m_nCruiseSpeed != 0)
|
||||||
|
#endif
|
||||||
|
speedStyleMultiplier /= pVehicle->AutoPilot.m_nCruiseSpeed;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
speedStyleMultiplier = 1.0f;
|
speedStyleMultiplier = 1.0f;
|
||||||
|
@ -179,10 +179,8 @@ void CGarages::Shutdown(void)
|
|||||||
void CGarages::Update(void)
|
void CGarages::Update(void)
|
||||||
{
|
{
|
||||||
static int GarageToBeTidied = 0;
|
static int GarageToBeTidied = 0;
|
||||||
#ifndef GTA_PS2
|
|
||||||
if (CReplay::IsPlayingBack())
|
if (CReplay::IsPlayingBack())
|
||||||
return;
|
return;
|
||||||
#endif
|
|
||||||
bCamShouldBeOutisde = false;
|
bCamShouldBeOutisde = false;
|
||||||
TheCamera.pToGarageWeAreIn = nil;
|
TheCamera.pToGarageWeAreIn = nil;
|
||||||
TheCamera.pToGarageWeAreInForHackAvoidFirstPerson = nil;
|
TheCamera.pToGarageWeAreInForHackAvoidFirstPerson = nil;
|
||||||
@ -202,7 +200,7 @@ void CGarages::Update(void)
|
|||||||
aGarages[GarageToBeTidied].TidyUpGarage();
|
aGarages[GarageToBeTidied].TidyUpGarage();
|
||||||
}
|
}
|
||||||
|
|
||||||
int16 CGarages::AddOne(CVector p1, CVector p2, eGarageType type, int32 targetId)
|
int16 CGarages::AddOne(CVector p1, CVector p2, uint8 type, int32 targetId)
|
||||||
{
|
{
|
||||||
if (NumGarages >= NUM_GARAGES) {
|
if (NumGarages >= NUM_GARAGES) {
|
||||||
assert(0);
|
assert(0);
|
||||||
@ -285,7 +283,7 @@ int16 CGarages::AddOne(CVector p1, CVector p2, eGarageType type, int32 targetId)
|
|||||||
return NumGarages++;
|
return NumGarages++;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGarages::ChangeGarageType(int16 garage, eGarageType type, int32 mi)
|
void CGarages::ChangeGarageType(int16 garage, uint8 type, int32 mi)
|
||||||
{
|
{
|
||||||
CGarage* pGarage = &aGarages[garage];
|
CGarage* pGarage = &aGarages[garage];
|
||||||
pGarage->m_eGarageType = type;
|
pGarage->m_eGarageType = type;
|
||||||
@ -2198,7 +2196,7 @@ void CGarages::CloseHideOutGaragesBeforeSave()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int32 CGarages::CountCarsInHideoutGarage(eGarageType type)
|
int32 CGarages::CountCarsInHideoutGarage(uint8 type)
|
||||||
{
|
{
|
||||||
int32 total = 0;
|
int32 total = 0;
|
||||||
for (int i = 0; i < NUM_GARAGE_STORED_CARS; i++) {
|
for (int i = 0; i < NUM_GARAGE_STORED_CARS; i++) {
|
||||||
@ -2218,7 +2216,7 @@ int32 CGarages::CountCarsInHideoutGarage(eGarageType type)
|
|||||||
return total;
|
return total;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32 CGarages::FindMaxNumStoredCarsForGarage(eGarageType type)
|
int32 CGarages::FindMaxNumStoredCarsForGarage(uint8 type)
|
||||||
{
|
{
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case GARAGE_HIDEOUT_ONE:
|
case GARAGE_HIDEOUT_ONE:
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
class CVehicle;
|
class CVehicle;
|
||||||
class CCamera;
|
class CCamera;
|
||||||
|
|
||||||
enum eGarageState : int8
|
enum eGarageState
|
||||||
{
|
{
|
||||||
GS_FULLYCLOSED,
|
GS_FULLYCLOSED,
|
||||||
GS_OPENED,
|
GS_OPENED,
|
||||||
@ -18,7 +18,7 @@ enum eGarageState : int8
|
|||||||
GS_AFTERDROPOFF,
|
GS_AFTERDROPOFF,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum eGarageType : int8
|
enum eGarageType
|
||||||
{
|
{
|
||||||
GARAGE_NONE,
|
GARAGE_NONE,
|
||||||
GARAGE_MISSION,
|
GARAGE_MISSION,
|
||||||
@ -81,8 +81,8 @@ VALIDATE_SIZE(CStoredCar, 0x28);
|
|||||||
|
|
||||||
class CGarage
|
class CGarage
|
||||||
{
|
{
|
||||||
eGarageType m_eGarageType;
|
uint8 m_eGarageType;
|
||||||
eGarageState m_eGarageState;
|
uint8 m_eGarageState;
|
||||||
bool field_2; // unused
|
bool field_2; // unused
|
||||||
bool m_bClosingWithoutTargetCar;
|
bool m_bClosingWithoutTargetCar;
|
||||||
bool m_bDeactivated;
|
bool m_bDeactivated;
|
||||||
@ -207,8 +207,8 @@ public:
|
|||||||
#endif
|
#endif
|
||||||
static void Update(void);
|
static void Update(void);
|
||||||
|
|
||||||
static int16 AddOne(CVector pos1, CVector pos2, eGarageType type, int32 targetId);
|
static int16 AddOne(CVector pos1, CVector pos2, uint8 type, int32 targetId);
|
||||||
static void ChangeGarageType(int16, eGarageType, int32);
|
static void ChangeGarageType(int16, uint8, int32);
|
||||||
static void PrintMessages(void);
|
static void PrintMessages(void);
|
||||||
static void TriggerMessage(const char* text, int16, uint16 time, int16);
|
static void TriggerMessage(const char* text, int16, uint16 time, int16);
|
||||||
static void SetTargetCarForMissonGarage(int16, CVehicle*);
|
static void SetTargetCarForMissonGarage(int16, CVehicle*);
|
||||||
@ -244,11 +244,14 @@ private:
|
|||||||
static bool IsCarSprayable(CVehicle*);
|
static bool IsCarSprayable(CVehicle*);
|
||||||
static float FindDoorHeightForMI(int32);
|
static float FindDoorHeightForMI(int32);
|
||||||
static void CloseHideOutGaragesBeforeSave(void);
|
static void CloseHideOutGaragesBeforeSave(void);
|
||||||
static int32 CountCarsInHideoutGarage(eGarageType);
|
static int32 CountCarsInHideoutGarage(uint8);
|
||||||
static int32 FindMaxNumStoredCarsForGarage(eGarageType);
|
static int32 FindMaxNumStoredCarsForGarage(uint8);
|
||||||
static int32 GetBombTypeForGarageType(eGarageType type) { return type - GARAGE_BOMBSHOP1 + 1; }
|
static int32 GetBombTypeForGarageType(uint8 type) { return type - GARAGE_BOMBSHOP1 + 1; }
|
||||||
static int32 GetCarsCollectedIndexForGarageType(eGarageType type) { return type - GARAGE_COLLECTCARS_1; }
|
static int32 GetCarsCollectedIndexForGarageType(uint8 type) { return type - GARAGE_COLLECTCARS_1; }
|
||||||
|
|
||||||
friend class cAudioManager;
|
friend class cAudioManager;
|
||||||
friend class CGarage;
|
friend class CGarage;
|
||||||
|
#ifdef FIX_BUGS
|
||||||
|
friend class CReplay;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
@ -67,7 +67,7 @@ CPhoneInfo::Update(void)
|
|||||||
} else {
|
} else {
|
||||||
CPad::GetPad(0)->SetEnablePlayerControls(PLAYERCONTROL_PHONE);
|
CPad::GetPad(0)->SetEnablePlayerControls(PLAYERCONTROL_PHONE);
|
||||||
if (player->m_nPedState == PED_MAKE_CALL)
|
if (player->m_nPedState == PED_MAKE_CALL)
|
||||||
player->m_nPedState = PED_IDLE;
|
player->SetPedState(PED_IDLE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
bool notInCar;
|
bool notInCar;
|
||||||
@ -114,7 +114,7 @@ CPhoneInfo::Update(void)
|
|||||||
player->m_fRotationCur = angleToFace;
|
player->m_fRotationCur = angleToFace;
|
||||||
player->m_fRotationDest = angleToFace;
|
player->m_fRotationDest = angleToFace;
|
||||||
player->SetHeading(angleToFace);
|
player->SetHeading(angleToFace);
|
||||||
player->m_nPedState = PED_MAKE_CALL;
|
player->SetPedState(PED_MAKE_CALL);
|
||||||
CPad::GetPad(0)->SetDisablePlayerControls(PLAYERCONTROL_PHONE);
|
CPad::GetPad(0)->SetDisablePlayerControls(PLAYERCONTROL_PHONE);
|
||||||
TheCamera.SetWideScreenOn();
|
TheCamera.SetWideScreenOn();
|
||||||
playerInfo->MakePlayerSafe(true);
|
playerInfo->MakePlayerSafe(true);
|
||||||
@ -412,7 +412,7 @@ PhonePutDownCB(CAnimBlendAssociation *assoc, void *arg)
|
|||||||
ped->bUpdateAnimHeading = true;
|
ped->bUpdateAnimHeading = true;
|
||||||
|
|
||||||
if (ped->m_nPedState == PED_MAKE_CALL)
|
if (ped->m_nPedState == PED_MAKE_CALL)
|
||||||
ped->m_nPedState = PED_IDLE;
|
ped->SetPedState(PED_IDLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -535,7 +535,7 @@ CPickups::GenerateNewOne(CVector pos, uint32 modelIndex, uint8 type, uint32 quan
|
|||||||
|
|
||||||
if (slot >= NUMPICKUPS) return -1;
|
if (slot >= NUMPICKUPS) return -1;
|
||||||
|
|
||||||
aPickUps[slot].m_eType = (ePickupType)type;
|
aPickUps[slot].m_eType = type;
|
||||||
aPickUps[slot].m_bRemoved = false;
|
aPickUps[slot].m_bRemoved = false;
|
||||||
aPickUps[slot].m_nQuantity = quantity;
|
aPickUps[slot].m_nQuantity = quantity;
|
||||||
if (type == PICKUP_ONCE_TIMEOUT)
|
if (type == PICKUP_ONCE_TIMEOUT)
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "Weapon.h"
|
#include "Weapon.h"
|
||||||
|
|
||||||
enum ePickupType : uint8
|
enum ePickupType
|
||||||
{
|
{
|
||||||
PICKUP_NONE = 0,
|
PICKUP_NONE = 0,
|
||||||
PICKUP_IN_SHOP,
|
PICKUP_IN_SHOP,
|
||||||
@ -29,7 +29,7 @@ class CPlayerPed;
|
|||||||
class CPickup
|
class CPickup
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ePickupType m_eType;
|
uint8 m_eType;
|
||||||
bool m_bRemoved;
|
bool m_bRemoved;
|
||||||
uint16 m_nQuantity;
|
uint16 m_nQuantity;
|
||||||
CObject *m_pObject;
|
CObject *m_pObject;
|
||||||
|
@ -391,15 +391,17 @@ void CRecordDataForChase::ProcessControlCars(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if (defined(GTA_PS2) || defined(FIX_BUGS))
|
|
||||||
bool CRecordDataForChase::ShouldThisPadBeLeftAlone(uint8 pad)
|
bool CRecordDataForChase::ShouldThisPadBeLeftAlone(uint8 pad)
|
||||||
{
|
{
|
||||||
// may be wrong
|
// may be wrong
|
||||||
if (Status == STATE_NONE || Status == STATE_PLAYBACK)
|
if (Status == STATE_PLAYBACK_INIT) // this is useless but ps2 def checks if it's STATE_PLAYBACK_INIT
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if (Status == STATE_RECORD)
|
||||||
return pad != 0;
|
return pad != 0;
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
void CRecordDataForChase::GiveUsACar(int32 mi, CVector pos, float angle, CAutomobile** ppCar, uint8 colour1, uint8 colour2)
|
void CRecordDataForChase::GiveUsACar(int32 mi, CVector pos, float angle, CAutomobile** ppCar, uint8 colour1, uint8 colour2)
|
||||||
{
|
{
|
||||||
|
@ -57,9 +57,7 @@ public:
|
|||||||
static void RestoreInfoForMatrix(CMatrix&, CCarStateEachFrame*);
|
static void RestoreInfoForMatrix(CMatrix&, CCarStateEachFrame*);
|
||||||
static void RestoreInfoForCar(CAutomobile*, CCarStateEachFrame*, bool);
|
static void RestoreInfoForCar(CAutomobile*, CCarStateEachFrame*, bool);
|
||||||
static void ProcessControlCars(void);
|
static void ProcessControlCars(void);
|
||||||
#if (defined(GTA_PS2) || defined(FIX_BUGS))
|
|
||||||
static bool ShouldThisPadBeLeftAlone(uint8 pad);
|
static bool ShouldThisPadBeLeftAlone(uint8 pad);
|
||||||
#endif
|
|
||||||
static void GiveUsACar(int32, CVector, float, CAutomobile**, uint8, uint8);
|
static void GiveUsACar(int32, CVector, float, CAutomobile**, uint8, uint8);
|
||||||
static void StartChaseScene(float);
|
static void StartChaseScene(float);
|
||||||
static void CleanUpChaseScene(void);
|
static void CleanUpChaseScene(void);
|
||||||
|
@ -10,6 +10,10 @@
|
|||||||
#include "DMAudio.h"
|
#include "DMAudio.h"
|
||||||
#include "Draw.h"
|
#include "Draw.h"
|
||||||
#include "FileMgr.h"
|
#include "FileMgr.h"
|
||||||
|
#ifdef FIX_BUGS
|
||||||
|
#include "Fire.h"
|
||||||
|
#include "Garages.h"
|
||||||
|
#endif
|
||||||
#include "Heli.h"
|
#include "Heli.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "Matrix.h"
|
#include "Matrix.h"
|
||||||
@ -22,6 +26,10 @@
|
|||||||
#include "Plane.h"
|
#include "Plane.h"
|
||||||
#include "Pools.h"
|
#include "Pools.h"
|
||||||
#include "Population.h"
|
#include "Population.h"
|
||||||
|
#ifdef FIX_BUGS
|
||||||
|
#include "Projectile.h"
|
||||||
|
#include "ProjectileInfo.h"
|
||||||
|
#endif
|
||||||
#include "Replay.h"
|
#include "Replay.h"
|
||||||
#include "References.h"
|
#include "References.h"
|
||||||
#include "Pools.h"
|
#include "Pools.h"
|
||||||
@ -102,6 +110,11 @@ float CReplay::fDistanceLookAroundCam;
|
|||||||
float CReplay::fBetaAngleLookAroundCam;
|
float CReplay::fBetaAngleLookAroundCam;
|
||||||
float CReplay::fAlphaAngleLookAroundCam;
|
float CReplay::fAlphaAngleLookAroundCam;
|
||||||
#ifdef FIX_BUGS
|
#ifdef FIX_BUGS
|
||||||
|
uint8* CReplay::pGarages;
|
||||||
|
CFire* CReplay::FireArray;
|
||||||
|
uint32 CReplay::NumOfFires;
|
||||||
|
uint8* CReplay::paProjectileInfo;
|
||||||
|
uint8* CReplay::paProjectiles;
|
||||||
int CReplay::nHandleOfPlayerPed[NUMPLAYERS];
|
int CReplay::nHandleOfPlayerPed[NUMPLAYERS];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -1025,10 +1038,10 @@ void CReplay::ProcessReplayCamera(void)
|
|||||||
TheCamera.GetUp() = CVector(0.0f, 1.0f, 0.0f);
|
TheCamera.GetUp() = CVector(0.0f, 1.0f, 0.0f);
|
||||||
TheCamera.GetRight() = CVector(1.0f, 0.0f, 0.0f);
|
TheCamera.GetRight() = CVector(1.0f, 0.0f, 0.0f);
|
||||||
RwMatrix* pm = RwFrameGetMatrix(RwCameraGetFrame(TheCamera.m_pRwCamera));
|
RwMatrix* pm = RwFrameGetMatrix(RwCameraGetFrame(TheCamera.m_pRwCamera));
|
||||||
pm->pos = *(RwV3d*)&TheCamera.GetPosition();
|
pm->pos = TheCamera.GetPosition();
|
||||||
pm->at = *(RwV3d*)&TheCamera.GetForward();
|
pm->at = TheCamera.GetForward();
|
||||||
pm->up = *(RwV3d*)&TheCamera.GetUp();
|
pm->up = TheCamera.GetUp();
|
||||||
pm->right = *(RwV3d*)&TheCamera.GetRight();
|
pm->right = TheCamera.GetRight();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case REPLAYCAMMODE_FIXED:
|
case REPLAYCAMMODE_FIXED:
|
||||||
@ -1044,10 +1057,10 @@ void CReplay::ProcessReplayCamera(void)
|
|||||||
TheCamera.GetMatrix().GetUp() = up;
|
TheCamera.GetMatrix().GetUp() = up;
|
||||||
TheCamera.GetMatrix().GetRight() = right;
|
TheCamera.GetMatrix().GetRight() = right;
|
||||||
RwMatrix* pm = RwFrameGetMatrix(RwCameraGetFrame(TheCamera.m_pRwCamera));
|
RwMatrix* pm = RwFrameGetMatrix(RwCameraGetFrame(TheCamera.m_pRwCamera));
|
||||||
pm->pos = *(RwV3d*)&TheCamera.GetMatrix().GetPosition();
|
pm->pos = TheCamera.GetMatrix().GetPosition();
|
||||||
pm->at = *(RwV3d*)&TheCamera.GetMatrix().GetForward();
|
pm->at = TheCamera.GetMatrix().GetForward();
|
||||||
pm->up = *(RwV3d*)&TheCamera.GetMatrix().GetUp();
|
pm->up = TheCamera.GetMatrix().GetUp();
|
||||||
pm->right = *(RwV3d*)&TheCamera.GetMatrix().GetRight();
|
pm->right = TheCamera.GetMatrix().GetRight();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
@ -1156,6 +1169,17 @@ void CReplay::StoreStuffInMem(void)
|
|||||||
if (ped)
|
if (ped)
|
||||||
StoreDetailedPedAnimation(ped, &pPedAnims[i]);
|
StoreDetailedPedAnimation(ped, &pPedAnims[i]);
|
||||||
}
|
}
|
||||||
|
#ifdef FIX_BUGS
|
||||||
|
pGarages = new uint8[sizeof(CGarages::aGarages)];
|
||||||
|
memcpy(pGarages, CGarages::aGarages, sizeof(CGarages::aGarages));
|
||||||
|
FireArray = new CFire[NUM_FIRES];
|
||||||
|
memcpy(FireArray, gFireManager.m_aFires, sizeof(gFireManager.m_aFires));
|
||||||
|
NumOfFires = gFireManager.m_nTotalFires;
|
||||||
|
paProjectileInfo = new uint8[sizeof(gaProjectileInfo)];
|
||||||
|
memcpy(paProjectileInfo, gaProjectileInfo, sizeof(gaProjectileInfo));
|
||||||
|
paProjectiles = new uint8[sizeof(CProjectileInfo::ms_apProjectile)];
|
||||||
|
memcpy(paProjectiles, CProjectileInfo::ms_apProjectile, sizeof(CProjectileInfo::ms_apProjectile));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void CReplay::RestoreStuffFromMem(void)
|
void CReplay::RestoreStuffFromMem(void)
|
||||||
@ -1206,7 +1230,7 @@ void CReplay::RestoreStuffFromMem(void)
|
|||||||
ped->m_rwObject = nil;
|
ped->m_rwObject = nil;
|
||||||
ped->m_modelIndex = -1;
|
ped->m_modelIndex = -1;
|
||||||
ped->SetModelIndex(mi);
|
ped->SetModelIndex(mi);
|
||||||
ped->m_pVehicleAnim = 0;
|
ped->m_pVehicleAnim = nil;
|
||||||
ped->m_audioEntityId = DMAudio.CreateEntity(AUDIOTYPE_PHYSICAL, ped);
|
ped->m_audioEntityId = DMAudio.CreateEntity(AUDIOTYPE_PHYSICAL, ped);
|
||||||
DMAudio.SetEntityStatus(ped->m_audioEntityId, true);
|
DMAudio.SetEntityStatus(ped->m_audioEntityId, true);
|
||||||
CPopulation::UpdatePedCount((ePedType)ped->m_nPedType, false);
|
CPopulation::UpdatePedCount((ePedType)ped->m_nPedType, false);
|
||||||
@ -1322,6 +1346,22 @@ void CReplay::RestoreStuffFromMem(void)
|
|||||||
}
|
}
|
||||||
delete[] pPedAnims;
|
delete[] pPedAnims;
|
||||||
pPedAnims = nil;
|
pPedAnims = nil;
|
||||||
|
#ifdef FIX_BUGS
|
||||||
|
memcpy(CGarages::aGarages, pGarages, sizeof(CGarages::aGarages));
|
||||||
|
delete[] pGarages;
|
||||||
|
pGarages = nil;
|
||||||
|
memcpy(gFireManager.m_aFires, FireArray, sizeof(gFireManager.m_aFires));
|
||||||
|
delete[] FireArray;
|
||||||
|
FireArray = nil;
|
||||||
|
gFireManager.m_nTotalFires = NumOfFires;
|
||||||
|
memcpy(gaProjectileInfo, paProjectileInfo, sizeof(gaProjectileInfo));
|
||||||
|
delete[] paProjectileInfo;
|
||||||
|
paProjectileInfo = nil;
|
||||||
|
memcpy(CProjectileInfo::ms_apProjectile, paProjectiles, sizeof(CProjectileInfo::ms_apProjectile));
|
||||||
|
delete[] paProjectiles;
|
||||||
|
paProjectiles = nil;
|
||||||
|
//CExplosion::ClearAllExplosions(); not in III
|
||||||
|
#endif
|
||||||
DMAudio.ChangeMusicMode(MUSICMODE_FRONTEND);
|
DMAudio.ChangeMusicMode(MUSICMODE_FRONTEND);
|
||||||
DMAudio.SetRadioInCar(OldRadioStation);
|
DMAudio.SetRadioInCar(OldRadioStation);
|
||||||
DMAudio.ChangeMusicMode(MUSICMODE_GAME);
|
DMAudio.ChangeMusicMode(MUSICMODE_GAME);
|
||||||
@ -1541,10 +1581,10 @@ void CReplay::ProcessLookAroundCam(void)
|
|||||||
TheCamera.GetRight() = right;
|
TheCamera.GetRight() = right;
|
||||||
TheCamera.SetPosition(camera_pt);
|
TheCamera.SetPosition(camera_pt);
|
||||||
RwMatrix* pm = RwFrameGetMatrix(RwCameraGetFrame(TheCamera.m_pRwCamera));
|
RwMatrix* pm = RwFrameGetMatrix(RwCameraGetFrame(TheCamera.m_pRwCamera));
|
||||||
pm->pos = *(RwV3d*)&TheCamera.GetPosition();
|
pm->pos = TheCamera.GetPosition();
|
||||||
pm->at = *(RwV3d*)&TheCamera.GetForward();
|
pm->at = TheCamera.GetForward();
|
||||||
pm->up = *(RwV3d*)&TheCamera.GetUp();
|
pm->up = TheCamera.GetUp();
|
||||||
pm->right = *(RwV3d*)&TheCamera.GetRight();
|
pm->right = TheCamera.GetRight();
|
||||||
TheCamera.CalculateDerivedValues();
|
TheCamera.CalculateDerivedValues();
|
||||||
RwMatrixUpdate(RwFrameGetMatrix(RwCameraGetFrame(TheCamera.m_pRwCamera)));
|
RwMatrixUpdate(RwFrameGetMatrix(RwCameraGetFrame(TheCamera.m_pRwCamera)));
|
||||||
RwFrameUpdateObjects(RwCameraGetFrame(TheCamera.m_pRwCamera));
|
RwFrameUpdateObjects(RwCameraGetFrame(TheCamera.m_pRwCamera));
|
||||||
|
@ -275,6 +275,11 @@ private:
|
|||||||
static float fAlphaAngleLookAroundCam;
|
static float fAlphaAngleLookAroundCam;
|
||||||
static float fBetaAngleLookAroundCam;
|
static float fBetaAngleLookAroundCam;
|
||||||
#ifdef FIX_BUGS
|
#ifdef FIX_BUGS
|
||||||
|
static uint8* pGarages;
|
||||||
|
static CFire* FireArray;
|
||||||
|
static uint32 NumOfFires;
|
||||||
|
static uint8* paProjectileInfo;
|
||||||
|
static uint8* paProjectiles;
|
||||||
static int nHandleOfPlayerPed[NUMPLAYERS];
|
static int nHandleOfPlayerPed[NUMPLAYERS];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -90,8 +90,7 @@ CRoadBlocks::GenerateRoadBlockCopsForCar(CVehicle* pVehicle, int32 roadBlockType
|
|||||||
pCopPed->m_nRoadblockNode = roadBlockNode;
|
pCopPed->m_nRoadblockNode = roadBlockNode;
|
||||||
pCopPed->bCrouchWhenShooting = roadBlockType != 2;
|
pCopPed->bCrouchWhenShooting = roadBlockType != 2;
|
||||||
if (pEntityToAttack) {
|
if (pEntityToAttack) {
|
||||||
pCopPed->m_pPointGunAt = pEntityToAttack;
|
pCopPed->SetWeaponLockOnTarget(pEntityToAttack);
|
||||||
pEntityToAttack->RegisterReference(&pCopPed->m_pPointGunAt);
|
|
||||||
pCopPed->SetAttack(pEntityToAttack);
|
pCopPed->SetAttack(pEntityToAttack);
|
||||||
}
|
}
|
||||||
pCopPed->m_pMyVehicle = pVehicle;
|
pCopPed->m_pMyVehicle = pVehicle;
|
||||||
|
@ -238,12 +238,12 @@ const tScriptCommandData commands[] = {
|
|||||||
REGISTER_COMMAND(COMMAND_DIV_FLOAT_VAR_BY_FLOAT_LVAR, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, 0, " /="),
|
REGISTER_COMMAND(COMMAND_DIV_FLOAT_VAR_BY_FLOAT_LVAR, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, 0, " /="),
|
||||||
REGISTER_COMMAND(COMMAND_DIV_INT_LVAR_BY_INT_VAR, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, 0, " /="),
|
REGISTER_COMMAND(COMMAND_DIV_INT_LVAR_BY_INT_VAR, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, 0, " /="),
|
||||||
REGISTER_COMMAND(COMMAND_DIV_FLOAT_LVAR_BY_FLOAT_VAR, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, 0, " /="),
|
REGISTER_COMMAND(COMMAND_DIV_FLOAT_LVAR_BY_FLOAT_VAR, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, 0, " /="),
|
||||||
REGISTER_COMMAND(COMMAND_ADD_TIMED_VAL_TO_FLOAT_VAR, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, 0, " -=@"),
|
REGISTER_COMMAND(COMMAND_ADD_TIMED_VAL_TO_FLOAT_VAR, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, 0, " +=@"),
|
||||||
REGISTER_COMMAND(COMMAND_ADD_TIMED_VAL_TO_FLOAT_LVAR, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, 0, " -=@"),
|
REGISTER_COMMAND(COMMAND_ADD_TIMED_VAL_TO_FLOAT_LVAR, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, 0, " +=@"),
|
||||||
REGISTER_COMMAND(COMMAND_ADD_TIMED_FLOAT_VAR_TO_FLOAT_VAR, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, 0, " -=@"),
|
REGISTER_COMMAND(COMMAND_ADD_TIMED_FLOAT_VAR_TO_FLOAT_VAR, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, 0, " +=@"),
|
||||||
REGISTER_COMMAND(COMMAND_ADD_TIMED_FLOAT_LVAR_TO_FLOAT_LVAR, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, 0, " -=@"),
|
REGISTER_COMMAND(COMMAND_ADD_TIMED_FLOAT_LVAR_TO_FLOAT_LVAR, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, 0, " +=@"),
|
||||||
REGISTER_COMMAND(COMMAND_ADD_TIMED_FLOAT_LVAR_TO_FLOAT_VAR, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, 0, " -=@"),
|
REGISTER_COMMAND(COMMAND_ADD_TIMED_FLOAT_LVAR_TO_FLOAT_VAR, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, 0, " +=@"),
|
||||||
REGISTER_COMMAND(COMMAND_ADD_TIMED_FLOAT_VAR_TO_FLOAT_LVAR, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, 0, " -=@"),
|
REGISTER_COMMAND(COMMAND_ADD_TIMED_FLOAT_VAR_TO_FLOAT_LVAR, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, 0, " +=@"),
|
||||||
REGISTER_COMMAND(COMMAND_SUB_TIMED_VAL_FROM_FLOAT_VAR, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, 0, " -=@"),
|
REGISTER_COMMAND(COMMAND_SUB_TIMED_VAL_FROM_FLOAT_VAR, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, 0, " -=@"),
|
||||||
REGISTER_COMMAND(COMMAND_SUB_TIMED_VAL_FROM_FLOAT_LVAR, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, 0, " -=@"),
|
REGISTER_COMMAND(COMMAND_SUB_TIMED_VAL_FROM_FLOAT_LVAR, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, 0, " -=@"),
|
||||||
REGISTER_COMMAND(COMMAND_SUB_TIMED_FLOAT_VAR_FROM_FLOAT_VAR, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, 0, " -=@"),
|
REGISTER_COMMAND(COMMAND_SUB_TIMED_FLOAT_VAR_FROM_FLOAT_VAR, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, 0, " -=@"),
|
||||||
@ -3593,7 +3593,7 @@ int8 CRunningScript::ProcessCommands100To199(int32 command)
|
|||||||
CollectParameters(&m_nIp, 2);
|
CollectParameters(&m_nIp, 2);
|
||||||
CVehicle* car = CPools::GetVehiclePool()->GetAt(ScriptParams[0]);
|
CVehicle* car = CPools::GetVehiclePool()->GetAt(ScriptParams[0]);
|
||||||
script_assert(car);
|
script_assert(car);
|
||||||
car->AutoPilot.m_nDrivingStyle = (eCarDrivingStyle)ScriptParams[1];
|
car->AutoPilot.m_nDrivingStyle = (uint8)ScriptParams[1];
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
case COMMAND_SET_CAR_MISSION:
|
case COMMAND_SET_CAR_MISSION:
|
||||||
@ -3601,7 +3601,7 @@ int8 CRunningScript::ProcessCommands100To199(int32 command)
|
|||||||
CollectParameters(&m_nIp, 2);
|
CollectParameters(&m_nIp, 2);
|
||||||
CVehicle* car = CPools::GetVehiclePool()->GetAt(ScriptParams[0]);
|
CVehicle* car = CPools::GetVehiclePool()->GetAt(ScriptParams[0]);
|
||||||
script_assert(car);
|
script_assert(car);
|
||||||
car->AutoPilot.m_nCarMission = (eCarMission)ScriptParams[1];
|
car->AutoPilot.m_nCarMission = (uint8)ScriptParams[1];
|
||||||
car->AutoPilot.m_nAntiReverseTimer = CTimer::GetTimeInMilliseconds();
|
car->AutoPilot.m_nAntiReverseTimer = CTimer::GetTimeInMilliseconds();
|
||||||
car->bEngineOn = true;
|
car->bEngineOn = true;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -396,7 +396,7 @@ private:
|
|||||||
friend class CRunningScript;
|
friend class CRunningScript;
|
||||||
friend class CHud;
|
friend class CHud;
|
||||||
friend void CMissionCleanup::Process();
|
friend void CMissionCleanup::Process();
|
||||||
#ifdef FIX_BUGS
|
#ifdef MISSION_REPLAY
|
||||||
friend void RetryMission(int, int);
|
friend void RetryMission(int, int);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -291,7 +291,7 @@ int8 CRunningScript::ProcessCommands500To599(int32 command)
|
|||||||
infZ = *(float*)&ScriptParams[5];
|
infZ = *(float*)&ScriptParams[5];
|
||||||
supZ = *(float*)&ScriptParams[2];
|
supZ = *(float*)&ScriptParams[2];
|
||||||
}
|
}
|
||||||
ScriptParams[0] = CGarages::AddOne(CVector(infX, infY, infZ), CVector(supX, supY, supZ), (eGarageType)ScriptParams[6], 0);
|
ScriptParams[0] = CGarages::AddOne(CVector(infX, infY, infZ), CVector(supX, supY, supZ), ScriptParams[6], 0);
|
||||||
StoreParameters(&m_nIp, 1);
|
StoreParameters(&m_nIp, 1);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -316,7 +316,7 @@ int8 CRunningScript::ProcessCommands500To599(int32 command)
|
|||||||
infZ = *(float*)&ScriptParams[5];
|
infZ = *(float*)&ScriptParams[5];
|
||||||
supZ = *(float*)&ScriptParams[2];
|
supZ = *(float*)&ScriptParams[2];
|
||||||
}
|
}
|
||||||
ScriptParams[0] = CGarages::AddOne(CVector(infX, infY, infZ), CVector(supX, supY, supZ), (eGarageType)ScriptParams[6], ScriptParams[7]);
|
ScriptParams[0] = CGarages::AddOne(CVector(infX, infY, infZ), CVector(supX, supY, supZ), ScriptParams[6], ScriptParams[7]);
|
||||||
StoreParameters(&m_nIp, 1);
|
StoreParameters(&m_nIp, 1);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -996,7 +996,7 @@ int8 CRunningScript::ProcessCommands600To699(int32 command)
|
|||||||
CollectParameters(&m_nIp, 4);
|
CollectParameters(&m_nIp, 4);
|
||||||
int mi = ScriptParams[0] >= 0 ? ScriptParams[0] : CTheScripts::UsedObjectArray[-ScriptParams[0]].index;
|
int mi = ScriptParams[0] >= 0 ? ScriptParams[0] : CTheScripts::UsedObjectArray[-ScriptParams[0]].index;
|
||||||
CObject* pObj = new CObject(mi, false);
|
CObject* pObj = new CObject(mi, false);
|
||||||
; pObj->ObjectCreatedBy = MISSION_OBJECT;
|
pObj->ObjectCreatedBy = MISSION_OBJECT;
|
||||||
CVector pos = *(CVector*)&ScriptParams[1];
|
CVector pos = *(CVector*)&ScriptParams[1];
|
||||||
if (pos.z <= MAP_Z_LOW_LIMIT)
|
if (pos.z <= MAP_Z_LOW_LIMIT)
|
||||||
pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y);
|
pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y);
|
||||||
@ -1826,7 +1826,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command)
|
|||||||
}
|
}
|
||||||
case COMMAND_CHANGE_GARAGE_TYPE:
|
case COMMAND_CHANGE_GARAGE_TYPE:
|
||||||
CollectParameters(&m_nIp, 2);
|
CollectParameters(&m_nIp, 2);
|
||||||
CGarages::ChangeGarageType(ScriptParams[0], (eGarageType)ScriptParams[1], 0);
|
CGarages::ChangeGarageType(ScriptParams[0], ScriptParams[1], 0);
|
||||||
return 0;
|
return 0;
|
||||||
case COMMAND_ACTIVATE_CRUSHER_CRANE:
|
case COMMAND_ACTIVATE_CRUSHER_CRANE:
|
||||||
{
|
{
|
||||||
|
@ -1436,7 +1436,7 @@ int8 CRunningScript::ProcessCommands900To999(int32 command)
|
|||||||
CollectParameters(&m_nIp, 2);
|
CollectParameters(&m_nIp, 2);
|
||||||
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]);
|
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]);
|
||||||
script_assert(pVehicle);
|
script_assert(pVehicle);
|
||||||
pVehicle->SetStatus((eEntityStatus)ScriptParams[1]);
|
pVehicle->SetStatus(ScriptParams[1]);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
case COMMAND_IS_CHAR_MALE:
|
case COMMAND_IS_CHAR_MALE:
|
||||||
@ -1459,7 +1459,7 @@ int8 CRunningScript::ProcessCommands900To999(int32 command)
|
|||||||
case COMMAND_CHANGE_GARAGE_TYPE_WITH_CAR_MODEL:
|
case COMMAND_CHANGE_GARAGE_TYPE_WITH_CAR_MODEL:
|
||||||
{
|
{
|
||||||
CollectParameters(&m_nIp, 3);
|
CollectParameters(&m_nIp, 3);
|
||||||
CGarages::ChangeGarageType(ScriptParams[0], (eGarageType)ScriptParams[1], ScriptParams[2]);
|
CGarages::ChangeGarageType(ScriptParams[0], ScriptParams[1], ScriptParams[2]);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
case COMMAND_FIND_DRUG_PLANE_COORDINATES:
|
case COMMAND_FIND_DRUG_PLANE_COORDINATES:
|
||||||
@ -2025,3 +2025,143 @@ int8 CRunningScript::ProcessCommands900To999(int32 command)
|
|||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32 CTheScripts::GetNewUniqueScriptSphereIndex(int32 index)
|
||||||
|
{
|
||||||
|
if (ScriptSphereArray[index].m_Index >= UINT16_MAX - 1)
|
||||||
|
ScriptSphereArray[index].m_Index = 1;
|
||||||
|
else
|
||||||
|
ScriptSphereArray[index].m_Index++;
|
||||||
|
return (uint16)index | ScriptSphereArray[index].m_Index << 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32 CTheScripts::GetActualScriptSphereIndex(int32 index)
|
||||||
|
{
|
||||||
|
if (index == -1)
|
||||||
|
return -1;
|
||||||
|
uint16 check = (uint32)index >> 16;
|
||||||
|
uint16 array_idx = index & (0xFFFF);
|
||||||
|
script_assert(array_idx < ARRAY_SIZE(ScriptSphereArray));
|
||||||
|
if (check != ScriptSphereArray[array_idx].m_Index)
|
||||||
|
return -1;
|
||||||
|
return array_idx;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CTheScripts::DrawScriptSpheres()
|
||||||
|
{
|
||||||
|
for (int i = 0; i < MAX_NUM_SCRIPT_SPHERES; i++) {
|
||||||
|
if (ScriptSphereArray[i].m_bInUse)
|
||||||
|
C3dMarkers::PlaceMarkerSet(ScriptSphereArray[i].m_Id, MARKERTYPE_CYLINDER, ScriptSphereArray[i].m_vecCenter, ScriptSphereArray[i].m_fRadius,
|
||||||
|
SPHERE_MARKER_R, SPHERE_MARKER_G, SPHERE_MARKER_B, SPHERE_MARKER_A, SPHERE_MARKER_PULSE_PERIOD, SPHERE_MARKER_PULSE_FRACTION, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int32 CTheScripts::AddScriptSphere(int32 id, CVector pos, float radius)
|
||||||
|
{
|
||||||
|
int16 i = 0;
|
||||||
|
for (i = 0; i < MAX_NUM_SCRIPT_SPHERES; i++) {
|
||||||
|
if (!ScriptSphereArray[i].m_bInUse)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#ifdef FIX_BUGS
|
||||||
|
if (i == MAX_NUM_SCRIPT_SPHERES)
|
||||||
|
return -1;
|
||||||
|
#endif
|
||||||
|
ScriptSphereArray[i].m_bInUse = true;
|
||||||
|
ScriptSphereArray[i].m_Id = id;
|
||||||
|
ScriptSphereArray[i].m_vecCenter = pos;
|
||||||
|
ScriptSphereArray[i].m_fRadius = radius;
|
||||||
|
return GetNewUniqueScriptSphereIndex(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CTheScripts::RemoveScriptSphere(int32 index)
|
||||||
|
{
|
||||||
|
index = GetActualScriptSphereIndex(index);
|
||||||
|
if (index == -1)
|
||||||
|
return;
|
||||||
|
ScriptSphereArray[index].m_bInUse = false;
|
||||||
|
ScriptSphereArray[index].m_Id = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CTheScripts::AddToBuildingSwapArray(CBuilding* pBuilding, int32 old_model, int32 new_model)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
bool found = false;
|
||||||
|
while (i < MAX_NUM_BUILDING_SWAPS && !found) {
|
||||||
|
if (BuildingSwapArray[i].m_pBuilding == pBuilding)
|
||||||
|
found = true;
|
||||||
|
else
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
if (found) {
|
||||||
|
if (BuildingSwapArray[i].m_nOldModel == new_model) {
|
||||||
|
BuildingSwapArray[i].m_pBuilding = nil;
|
||||||
|
BuildingSwapArray[i].m_nOldModel = BuildingSwapArray[i].m_nNewModel = -1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
BuildingSwapArray[i].m_nNewModel = new_model;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
i = 0;
|
||||||
|
while (i < MAX_NUM_BUILDING_SWAPS && !found) {
|
||||||
|
if (BuildingSwapArray[i].m_pBuilding == nil)
|
||||||
|
found = true;
|
||||||
|
else
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
if (found) {
|
||||||
|
BuildingSwapArray[i].m_pBuilding = pBuilding;
|
||||||
|
BuildingSwapArray[i].m_nNewModel = new_model;
|
||||||
|
BuildingSwapArray[i].m_nOldModel = old_model;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CTheScripts::AddToInvisibilitySwapArray(CEntity* pEntity, bool remove)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
bool found = false;
|
||||||
|
while (i < MAX_NUM_INVISIBILITY_SETTINGS && !found) {
|
||||||
|
if (InvisibilitySettingArray[i] == pEntity)
|
||||||
|
found = true;
|
||||||
|
else
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
if (found) {
|
||||||
|
if (remove)
|
||||||
|
InvisibilitySettingArray[i] = nil;
|
||||||
|
}
|
||||||
|
else if (!remove) {
|
||||||
|
i = 0;
|
||||||
|
while (i < MAX_NUM_INVISIBILITY_SETTINGS && !found) {
|
||||||
|
if (InvisibilitySettingArray[i] == nil)
|
||||||
|
found = true;
|
||||||
|
else
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
if (found)
|
||||||
|
InvisibilitySettingArray[i] = pEntity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CTheScripts::UndoBuildingSwaps()
|
||||||
|
{
|
||||||
|
for (int i = 0; i < MAX_NUM_BUILDING_SWAPS; i++) {
|
||||||
|
if (BuildingSwapArray[i].m_pBuilding) {
|
||||||
|
BuildingSwapArray[i].m_pBuilding->ReplaceWithNewModel(BuildingSwapArray[i].m_nOldModel);
|
||||||
|
BuildingSwapArray[i].m_pBuilding = nil;
|
||||||
|
BuildingSwapArray[i].m_nOldModel = BuildingSwapArray[i].m_nNewModel = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CTheScripts::UndoEntityInvisibilitySettings()
|
||||||
|
{
|
||||||
|
for (int i = 0; i < MAX_NUM_INVISIBILITY_SETTINGS; i++) {
|
||||||
|
if (InvisibilitySettingArray[i]) {
|
||||||
|
InvisibilitySettingArray[i]->bIsVisible = true;
|
||||||
|
InvisibilitySettingArray[i] = nil;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -17,147 +17,6 @@
|
|||||||
#include "World.h"
|
#include "World.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
|
|
||||||
int32 CTheScripts::GetNewUniqueScriptSphereIndex(int32 index)
|
|
||||||
{
|
|
||||||
if (ScriptSphereArray[index].m_Index >= UINT16_MAX - 1)
|
|
||||||
ScriptSphereArray[index].m_Index = 1;
|
|
||||||
else
|
|
||||||
ScriptSphereArray[index].m_Index++;
|
|
||||||
return (uint16)index | ScriptSphereArray[index].m_Index << 16;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32 CTheScripts::GetActualScriptSphereIndex(int32 index)
|
|
||||||
{
|
|
||||||
if (index == -1)
|
|
||||||
return -1;
|
|
||||||
uint16 check = (uint32)index >> 16;
|
|
||||||
uint16 array_idx = index & (0xFFFF);
|
|
||||||
script_assert(array_idx < ARRAY_SIZE(ScriptSphereArray));
|
|
||||||
if (check != ScriptSphereArray[array_idx].m_Index)
|
|
||||||
return -1;
|
|
||||||
return array_idx;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CTheScripts::DrawScriptSpheres()
|
|
||||||
{
|
|
||||||
for (int i = 0; i < MAX_NUM_SCRIPT_SPHERES; i++) {
|
|
||||||
if (ScriptSphereArray[i].m_bInUse)
|
|
||||||
C3dMarkers::PlaceMarkerSet(ScriptSphereArray[i].m_Id, MARKERTYPE_CYLINDER, ScriptSphereArray[i].m_vecCenter, ScriptSphereArray[i].m_fRadius,
|
|
||||||
SPHERE_MARKER_R, SPHERE_MARKER_G, SPHERE_MARKER_B, SPHERE_MARKER_A, SPHERE_MARKER_PULSE_PERIOD, SPHERE_MARKER_PULSE_FRACTION, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int32 CTheScripts::AddScriptSphere(int32 id, CVector pos, float radius)
|
|
||||||
{
|
|
||||||
int16 i = 0;
|
|
||||||
for (i = 0; i < MAX_NUM_SCRIPT_SPHERES; i++) {
|
|
||||||
if (!ScriptSphereArray[i].m_bInUse)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#ifdef FIX_BUGS
|
|
||||||
if (i == MAX_NUM_SCRIPT_SPHERES)
|
|
||||||
return -1;
|
|
||||||
#endif
|
|
||||||
ScriptSphereArray[i].m_bInUse = true;
|
|
||||||
ScriptSphereArray[i].m_Id = id;
|
|
||||||
ScriptSphereArray[i].m_vecCenter = pos;
|
|
||||||
ScriptSphereArray[i].m_fRadius = radius;
|
|
||||||
return GetNewUniqueScriptSphereIndex(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CTheScripts::RemoveScriptSphere(int32 index)
|
|
||||||
{
|
|
||||||
index = GetActualScriptSphereIndex(index);
|
|
||||||
if (index == -1)
|
|
||||||
return;
|
|
||||||
ScriptSphereArray[index].m_bInUse = false;
|
|
||||||
ScriptSphereArray[index].m_Id = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CTheScripts::AddToBuildingSwapArray(CBuilding* pBuilding, int32 old_model, int32 new_model)
|
|
||||||
{
|
|
||||||
int i = 0;
|
|
||||||
bool found = false;
|
|
||||||
while (i < MAX_NUM_BUILDING_SWAPS && !found) {
|
|
||||||
if (BuildingSwapArray[i].m_pBuilding == pBuilding)
|
|
||||||
found = true;
|
|
||||||
else
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
if (found) {
|
|
||||||
if (BuildingSwapArray[i].m_nOldModel == new_model) {
|
|
||||||
BuildingSwapArray[i].m_pBuilding = nil;
|
|
||||||
BuildingSwapArray[i].m_nOldModel = BuildingSwapArray[i].m_nNewModel = -1;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
BuildingSwapArray[i].m_nNewModel = new_model;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
i = 0;
|
|
||||||
while (i < MAX_NUM_BUILDING_SWAPS && !found) {
|
|
||||||
if (BuildingSwapArray[i].m_pBuilding == nil)
|
|
||||||
found = true;
|
|
||||||
else
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
if (found) {
|
|
||||||
BuildingSwapArray[i].m_pBuilding = pBuilding;
|
|
||||||
BuildingSwapArray[i].m_nNewModel = new_model;
|
|
||||||
BuildingSwapArray[i].m_nOldModel = old_model;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CTheScripts::AddToInvisibilitySwapArray(CEntity* pEntity, bool remove)
|
|
||||||
{
|
|
||||||
int i = 0;
|
|
||||||
bool found = false;
|
|
||||||
while (i < MAX_NUM_INVISIBILITY_SETTINGS && !found) {
|
|
||||||
if (InvisibilitySettingArray[i] == pEntity)
|
|
||||||
found = true;
|
|
||||||
else
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
if (found) {
|
|
||||||
if (remove)
|
|
||||||
InvisibilitySettingArray[i] = nil;
|
|
||||||
}
|
|
||||||
else if (!remove) {
|
|
||||||
i = 0;
|
|
||||||
while (i < MAX_NUM_INVISIBILITY_SETTINGS && !found) {
|
|
||||||
if (InvisibilitySettingArray[i] == nil)
|
|
||||||
found = true;
|
|
||||||
else
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
if (found)
|
|
||||||
InvisibilitySettingArray[i] = pEntity;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CTheScripts::UndoBuildingSwaps()
|
|
||||||
{
|
|
||||||
for (int i = 0; i < MAX_NUM_BUILDING_SWAPS; i++) {
|
|
||||||
if (BuildingSwapArray[i].m_pBuilding) {
|
|
||||||
BuildingSwapArray[i].m_pBuilding->ReplaceWithNewModel(BuildingSwapArray[i].m_nOldModel);
|
|
||||||
BuildingSwapArray[i].m_pBuilding = nil;
|
|
||||||
BuildingSwapArray[i].m_nOldModel = BuildingSwapArray[i].m_nNewModel = -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CTheScripts::UndoEntityInvisibilitySettings()
|
|
||||||
{
|
|
||||||
for (int i = 0; i < MAX_NUM_INVISIBILITY_SETTINGS; i++) {
|
|
||||||
if (InvisibilitySettingArray[i]) {
|
|
||||||
InvisibilitySettingArray[i]->bIsVisible = true;
|
|
||||||
InvisibilitySettingArray[i] = nil;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void CRunningScript::UpdateCompareFlag(bool flag)
|
void CRunningScript::UpdateCompareFlag(bool flag)
|
||||||
{
|
{
|
||||||
if (m_bNotFlag)
|
if (m_bNotFlag)
|
||||||
@ -1921,7 +1780,7 @@ void CTheScripts::CleanUpThisPed(CPed* pPed)
|
|||||||
if (pPed->IsPedInControl())
|
if (pPed->IsPedInControl())
|
||||||
pPed->SetWanderPath(CGeneral::GetRandomNumber() & 7);
|
pPed->SetWanderPath(CGeneral::GetRandomNumber() & 7);
|
||||||
if (flees) {
|
if (flees) {
|
||||||
pPed->m_nPedState = state;
|
pPed->SetPedState(state);
|
||||||
pPed->SetMoveState(ms);
|
pPed->SetMoveState(ms);
|
||||||
}
|
}
|
||||||
--CPopulation::ms_nTotalMissionPeds;
|
--CPopulation::ms_nTotalMissionPeds;
|
||||||
|
@ -545,7 +545,14 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command)
|
|||||||
CStats::RegisterHighestScore(ScriptParams[0], ScriptParams[1]);
|
CStats::RegisterHighestScore(ScriptParams[0], ScriptParams[1]);
|
||||||
return 0;
|
return 0;
|
||||||
//case COMMAND_WARP_CHAR_INTO_CAR_AS_PASSENGER:
|
//case COMMAND_WARP_CHAR_INTO_CAR_AS_PASSENGER:
|
||||||
//case COMMAND_IS_CAR_PASSENGER_SEAT_FREE:
|
case COMMAND_IS_CAR_PASSENGER_SEAT_FREE:
|
||||||
|
{
|
||||||
|
CollectParameters(&m_nIp, 2);
|
||||||
|
CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]);
|
||||||
|
script_assert(pVehicle);
|
||||||
|
UpdateCompareFlag(ScriptParams[1] < pVehicle->m_nNumMaxPassengers && pVehicle->pPassengers[ScriptParams[1]] == nil);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
case COMMAND_GET_CHAR_IN_CAR_PASSENGER_SEAT:
|
case COMMAND_GET_CHAR_IN_CAR_PASSENGER_SEAT:
|
||||||
{
|
{
|
||||||
CollectParameters(&m_nIp, 2);
|
CollectParameters(&m_nIp, 2);
|
||||||
|
@ -45,7 +45,7 @@ CEntity *CAnimViewer::pTarget = nil;
|
|||||||
void
|
void
|
||||||
CAnimViewer::Render(void) {
|
CAnimViewer::Render(void) {
|
||||||
if (pTarget) {
|
if (pTarget) {
|
||||||
// pTarget->GetPosition() = CVector(0.0f, 0.0f, 0.0f);
|
// pTarget->GetPosition() = CVector(0.0f, 0.0f, 0.0f); // Only on Mobile
|
||||||
if (pTarget) {
|
if (pTarget) {
|
||||||
#ifdef FIX_BUGS
|
#ifdef FIX_BUGS
|
||||||
#ifdef PED_SKIN
|
#ifdef PED_SKIN
|
||||||
@ -61,7 +61,9 @@ CAnimViewer::Render(void) {
|
|||||||
|
|
||||||
void
|
void
|
||||||
CAnimViewer::Initialise(void) {
|
CAnimViewer::Initialise(void) {
|
||||||
LoadingScreen("Loading the ModelViewer", "", GetRandomSplashScreen());
|
// we need messages, messages needs hud, hud needs this
|
||||||
|
CHud::m_Wants_To_Draw_Hud = false;
|
||||||
|
|
||||||
animTxdSlot = CTxdStore::AddTxdSlot("generic");
|
animTxdSlot = CTxdStore::AddTxdSlot("generic");
|
||||||
CTxdStore::Create(animTxdSlot);
|
CTxdStore::Create(animTxdSlot);
|
||||||
int hudSlot = CTxdStore::AddTxdSlot("hud");
|
int hudSlot = CTxdStore::AddTxdSlot("hud");
|
||||||
@ -75,9 +77,6 @@ CAnimViewer::Initialise(void) {
|
|||||||
TheCamera.SetRwCamera(Scene.camera);
|
TheCamera.SetRwCamera(Scene.camera);
|
||||||
TheCamera.Cams[TheCamera.ActiveCam].Distance = 5.0f;
|
TheCamera.Cams[TheCamera.ActiveCam].Distance = 5.0f;
|
||||||
|
|
||||||
gbModelViewer = true;
|
|
||||||
CHud::m_Wants_To_Draw_Hud = false;
|
|
||||||
|
|
||||||
ThePaths.Init();
|
ThePaths.Init();
|
||||||
ThePaths.AllocatePathFindInfoMem(4500);
|
ThePaths.AllocatePathFindInfoMem(4500);
|
||||||
CCollision::Init();
|
CCollision::Init();
|
||||||
@ -113,7 +112,7 @@ CAnimViewer::Initialise(void) {
|
|||||||
CTimeCycle::Initialise();
|
CTimeCycle::Initialise();
|
||||||
CCarCtrl::Init();
|
CCarCtrl::Init();
|
||||||
CPlayerPed *player = new CPlayerPed();
|
CPlayerPed *player = new CPlayerPed();
|
||||||
player->SetPosition(0.0f, 0.0f, 0.0f);
|
player->SetPosition(0.0f, 0.0f, 0.0f); // This is 1000.f for all axes on Xbox, but 0.f on mobile?
|
||||||
CWorld::Players[0].m_pPed = player;
|
CWorld::Players[0].m_pPed = player;
|
||||||
CDraw::SetFOV(120.0f);
|
CDraw::SetFOV(120.0f);
|
||||||
CDraw::ms_fLODDistance = 500.0f;
|
CDraw::ms_fLODDistance = 500.0f;
|
||||||
@ -222,8 +221,7 @@ CAnimViewer::Update(void)
|
|||||||
{
|
{
|
||||||
static int modelId = 0;
|
static int modelId = 0;
|
||||||
static int animId = 0;
|
static int animId = 0;
|
||||||
// Please don't make this bool, static bool's are problematic on my side.
|
static bool reloadIFP = false;
|
||||||
static int reloadIFP = 0;
|
|
||||||
|
|
||||||
AssocGroupId animGroup = ASSOCGRP_STD;
|
AssocGroupId animGroup = ASSOCGRP_STD;
|
||||||
int nextModelId = modelId;
|
int nextModelId = modelId;
|
||||||
@ -248,7 +246,7 @@ CAnimViewer::Update(void)
|
|||||||
CAnimManager::Initialise();
|
CAnimManager::Initialise();
|
||||||
CAnimManager::LoadAnimFiles();
|
CAnimManager::LoadAnimFiles();
|
||||||
|
|
||||||
reloadIFP = 0;
|
reloadIFP = false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
animGroup = ASSOCGRP_STD;
|
animGroup = ASSOCGRP_STD;
|
||||||
@ -302,6 +300,7 @@ CAnimViewer::Update(void)
|
|||||||
pTarget->GetMatrix().GetPosition().z = 10.0f;
|
pTarget->GetMatrix().GetPosition().z = 10.0f;
|
||||||
#else
|
#else
|
||||||
pTarget->GetMatrix().GetPosition().z = 0.0f;
|
pTarget->GetMatrix().GetPosition().z = 0.0f;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (modelInfo->GetModelType() == MITYPE_PED) {
|
if (modelInfo->GetModelType() == MITYPE_PED) {
|
||||||
@ -309,7 +308,7 @@ CAnimViewer::Update(void)
|
|||||||
|
|
||||||
// Triangle in mobile
|
// Triangle in mobile
|
||||||
if (pad->GetSquareJustDown()) {
|
if (pad->GetSquareJustDown()) {
|
||||||
reloadIFP = 1;
|
reloadIFP = true;
|
||||||
AsciiToUnicode("IFP reloaded", gUString);
|
AsciiToUnicode("IFP reloaded", gUString);
|
||||||
CMessages::AddMessage(gUString, 1000, 0);
|
CMessages::AddMessage(gUString, 1000, 0);
|
||||||
|
|
||||||
|
132
src/core/Cam.cpp
132
src/core/Cam.cpp
@ -2472,7 +2472,7 @@ CCam::Process_Rocket(const CVector &CameraTarget, float, float, float)
|
|||||||
ResetStatics = false;
|
ResetStatics = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
((CPed*)CamTargetEntity)->m_pedIK.GetComponentPosition(&HeadPos, PED_HEAD);
|
((CPed*)CamTargetEntity)->m_pedIK.GetComponentPosition(HeadPos, PED_HEAD);
|
||||||
Source = HeadPos;
|
Source = HeadPos;
|
||||||
Source.z += 0.1f;
|
Source.z += 0.1f;
|
||||||
Source.x -= 0.19f*Cos(m_fInitialPlayerOrientation);
|
Source.x -= 0.19f*Cos(m_fInitialPlayerOrientation);
|
||||||
@ -2573,7 +2573,7 @@ CCam::Process_M16_1stPerson(const CVector &CameraTarget, float, float, float)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if GTA_VERSION < GTA3_PC_11
|
#if GTA_VERSION < GTA3_PC_11
|
||||||
((CPed*)CamTargetEntity)->m_pedIK.GetComponentPosition(&HeadPos, PED_HEAD);
|
((CPed*)CamTargetEntity)->m_pedIK.GetComponentPosition(HeadPos, PED_HEAD);
|
||||||
Source = HeadPos;
|
Source = HeadPos;
|
||||||
Source.z += 0.1f;
|
Source.z += 0.1f;
|
||||||
Source.x -= 0.19f*Cos(m_fInitialPlayerOrientation);
|
Source.x -= 0.19f*Cos(m_fInitialPlayerOrientation);
|
||||||
@ -2611,7 +2611,7 @@ CCam::Process_M16_1stPerson(const CVector &CameraTarget, float, float, float)
|
|||||||
HeadPos.x = 0.0f;
|
HeadPos.x = 0.0f;
|
||||||
HeadPos.y = 0.0f;
|
HeadPos.y = 0.0f;
|
||||||
HeadPos.z = 0.0f;
|
HeadPos.z = 0.0f;
|
||||||
((CPed*)CamTargetEntity)->m_pedIK.GetComponentPosition(&HeadPos, PED_HEAD);
|
((CPed*)CamTargetEntity)->m_pedIK.GetComponentPosition(HeadPos, PED_HEAD);
|
||||||
Source = HeadPos;
|
Source = HeadPos;
|
||||||
Source.z += 0.1f;
|
Source.z += 0.1f;
|
||||||
Source.x -= 0.19f * Cos(m_fInitialPlayerOrientation);
|
Source.x -= 0.19f * Cos(m_fInitialPlayerOrientation);
|
||||||
@ -2700,7 +2700,7 @@ CCam::Process_1stPerson(const CVector &CameraTarget, float TargetOrientation, fl
|
|||||||
ResetStatics = false;
|
ResetStatics = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
((CPed*)CamTargetEntity)->m_pedIK.GetComponentPosition(&HeadPos, PED_HEAD);
|
((CPed*)CamTargetEntity)->m_pedIK.GetComponentPosition(HeadPos, PED_HEAD);
|
||||||
Source = HeadPos;
|
Source = HeadPos;
|
||||||
Source.z += 0.1f;
|
Source.z += 0.1f;
|
||||||
Source.x -= 0.19f*Cos(m_fInitialPlayerOrientation);
|
Source.x -= 0.19f*Cos(m_fInitialPlayerOrientation);
|
||||||
@ -2868,7 +2868,7 @@ CCam::Process_1rstPersonPedOnPC(const CVector&, float TargetOrientation, float,
|
|||||||
Source = HeadPos;
|
Source = HeadPos;
|
||||||
|
|
||||||
// unused:
|
// unused:
|
||||||
// ((CPed*)CamTargetEntity)->m_pedIK.GetComponentPosition(&MidPos, PED_MID);
|
// ((CPed*)CamTargetEntity)->m_pedIK.GetComponentPosition(MidPos, PED_MID);
|
||||||
// Source - MidPos;
|
// Source - MidPos;
|
||||||
|
|
||||||
// Look around
|
// Look around
|
||||||
@ -2963,7 +2963,7 @@ CCam::Process_Sniper(const CVector &CameraTarget, float TargetOrientation, float
|
|||||||
ResetStatics = false;
|
ResetStatics = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
((CPed*)CamTargetEntity)->m_pedIK.GetComponentPosition(&HeadPos, PED_HEAD);
|
((CPed*)CamTargetEntity)->m_pedIK.GetComponentPosition(HeadPos, PED_HEAD);
|
||||||
Source = HeadPos;
|
Source = HeadPos;
|
||||||
Source.z += 0.1f;
|
Source.z += 0.1f;
|
||||||
Source.x -= 0.19f*Cos(m_fInitialPlayerOrientation);
|
Source.x -= 0.19f*Cos(m_fInitialPlayerOrientation);
|
||||||
@ -3003,8 +3003,7 @@ CCam::Process_Sniper(const CVector &CameraTarget, float TargetOrientation, float
|
|||||||
UseMouse = false;
|
UseMouse = false;
|
||||||
int ZoomInButton = ControlsManager.GetMouseButtonAssociatedWithAction(PED_SNIPER_ZOOM_IN);
|
int ZoomInButton = ControlsManager.GetMouseButtonAssociatedWithAction(PED_SNIPER_ZOOM_IN);
|
||||||
int ZoomOutButton = ControlsManager.GetMouseButtonAssociatedWithAction(PED_SNIPER_ZOOM_OUT);
|
int ZoomOutButton = ControlsManager.GetMouseButtonAssociatedWithAction(PED_SNIPER_ZOOM_OUT);
|
||||||
// TODO: enum? this should be mouse wheel up and down
|
if(ZoomInButton == rsMOUSEWHEELUPBUTTON || ZoomInButton == rsMOUSEWHEELDOWNBUTTON || ZoomOutButton == rsMOUSEWHEELUPBUTTON || ZoomOutButton == rsMOUSEWHEELDOWNBUTTON){
|
||||||
if(ZoomInButton == 4 || ZoomInButton == 5 || ZoomOutButton == 4 || ZoomOutButton == 5){
|
|
||||||
if(CPad::GetPad(0)->GetMouseWheelUp() || CPad::GetPad(0)->GetMouseWheelDown()){
|
if(CPad::GetPad(0)->GetMouseWheelUp() || CPad::GetPad(0)->GetMouseWheelDown()){
|
||||||
if(CPad::GetPad(0)->SniperZoomIn()){
|
if(CPad::GetPad(0)->SniperZoomIn()){
|
||||||
TargetFOV = FOV - 10.0f;
|
TargetFOV = FOV - 10.0f;
|
||||||
@ -4894,13 +4893,9 @@ CCam::Process_FollowCar_SA(const CVector& CameraTarget, float TargetOrientation,
|
|||||||
|
|
||||||
if (FOV > DefaultFOV)
|
if (FOV > DefaultFOV)
|
||||||
// 0.98f: CAR_FOV_FADE_MULT
|
// 0.98f: CAR_FOV_FADE_MULT
|
||||||
FOV = pow(0.98f, CTimer::GetTimeStep()) * (FOV - DefaultFOV) + DefaultFOV;
|
FOV = Pow(0.98f, CTimer::GetTimeStep()) * (FOV - DefaultFOV) + DefaultFOV;
|
||||||
|
|
||||||
if (FOV <= DefaultFOV + 30.0f) {
|
FOV = clamp(FOV, DefaultFOV, DefaultFOV + 30.0f);
|
||||||
if (FOV < DefaultFOV)
|
|
||||||
FOV = DefaultFOV;
|
|
||||||
} else
|
|
||||||
FOV = DefaultFOV + 30.0f;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// WORKAROUND: I still don't know how looking behind works (m_bCamDirectlyInFront is unused in III, they seem to use m_bUseTransitionBeta)
|
// WORKAROUND: I still don't know how looking behind works (m_bCamDirectlyInFront is unused in III, they seem to use m_bUseTransitionBeta)
|
||||||
@ -5030,7 +5025,7 @@ CCam::Process_FollowCar_SA(const CVector& CameraTarget, float TargetOrientation,
|
|||||||
targetAlpha = maxAlphaAllowed;
|
targetAlpha = maxAlphaAllowed;
|
||||||
}
|
}
|
||||||
float maxAlphaBlendAmount = CTimer::GetTimeStep() * CARCAM_SET[camSetArrPos][6];
|
float maxAlphaBlendAmount = CTimer::GetTimeStep() * CARCAM_SET[camSetArrPos][6];
|
||||||
float targetAlphaBlendAmount = (1.0f - pow(CARCAM_SET[camSetArrPos][5], CTimer::GetTimeStep())) * (targetAlpha - Alpha);
|
float targetAlphaBlendAmount = (1.0f - Pow(CARCAM_SET[camSetArrPos][5], CTimer::GetTimeStep())) * (targetAlpha - Alpha);
|
||||||
if (targetAlphaBlendAmount <= maxAlphaBlendAmount) {
|
if (targetAlphaBlendAmount <= maxAlphaBlendAmount) {
|
||||||
if (targetAlphaBlendAmount < -maxAlphaBlendAmount)
|
if (targetAlphaBlendAmount < -maxAlphaBlendAmount)
|
||||||
targetAlphaBlendAmount = -maxAlphaBlendAmount;
|
targetAlphaBlendAmount = -maxAlphaBlendAmount;
|
||||||
@ -5042,9 +5037,9 @@ CCam::Process_FollowCar_SA(const CVector& CameraTarget, float TargetOrientation,
|
|||||||
float stickX = -(pad->GetCarGunLeftRight());
|
float stickX = -(pad->GetCarGunLeftRight());
|
||||||
float stickY = pad->GetCarGunUpDown();
|
float stickY = pad->GetCarGunUpDown();
|
||||||
|
|
||||||
// In SA this checks for m_bUseMouse3rdPerson so num2/num8 do not move camera when Keyboard & Mouse controls are used.
|
// In SA this is for not let num2/num8 move camera when Keyboard & Mouse controls are used.
|
||||||
if (CCamera::m_bUseMouse3rdPerson)
|
// if (CCamera::m_bUseMouse3rdPerson)
|
||||||
stickY = 0.0f;
|
// stickY = 0.0f;
|
||||||
|
|
||||||
float xMovement = Abs(stickX) * (FOV / 80.0f * 5.f / 70.f) * stickX * 0.007f * 0.007f;
|
float xMovement = Abs(stickX) * (FOV / 80.0f * 5.f / 70.f) * stickX * 0.007f * 0.007f;
|
||||||
float yMovement = Abs(stickY) * (FOV / 80.0f * 3.f / 70.f) * stickY * 0.007f * 0.007f;
|
float yMovement = Abs(stickY) * (FOV / 80.0f * 3.f / 70.f) * stickY * 0.007f * 0.007f;
|
||||||
@ -5122,7 +5117,7 @@ CCam::Process_FollowCar_SA(const CVector& CameraTarget, float TargetOrientation,
|
|||||||
float betaSpeedFromStickX = xMovement * CARCAM_SET[camSetArrPos][12];
|
float betaSpeedFromStickX = xMovement * CARCAM_SET[camSetArrPos][12];
|
||||||
|
|
||||||
float newAngleSpeedMaxBlendAmount = CARCAM_SET[camSetArrPos][9];
|
float newAngleSpeedMaxBlendAmount = CARCAM_SET[camSetArrPos][9];
|
||||||
float angleChangeStep = pow(CARCAM_SET[camSetArrPos][8], CTimer::GetTimeStep());
|
float angleChangeStep = Pow(CARCAM_SET[camSetArrPos][8], CTimer::GetTimeStep());
|
||||||
float targetBetaWithStickBlendAmount = betaSpeedFromStickX + (targetBeta - Beta) / Max(CTimer::GetTimeStep(), 1.0f);
|
float targetBetaWithStickBlendAmount = betaSpeedFromStickX + (targetBeta - Beta) / Max(CTimer::GetTimeStep(), 1.0f);
|
||||||
|
|
||||||
if (targetBetaWithStickBlendAmount < -newAngleSpeedMaxBlendAmount)
|
if (targetBetaWithStickBlendAmount < -newAngleSpeedMaxBlendAmount)
|
||||||
@ -5234,69 +5229,78 @@ CCam::Process_FollowCar_SA(const CVector& CameraTarget, float TargetOrientation,
|
|||||||
// SA calls SetColVarsVehicle in here
|
// SA calls SetColVarsVehicle in here
|
||||||
if (nextDirectionIsForward) {
|
if (nextDirectionIsForward) {
|
||||||
|
|
||||||
// This is new in LCS!
|
// LCS uses exactly the same collision code as FollowPedWithMouse, so we will do so.
|
||||||
|
|
||||||
|
// This is only in LCS!
|
||||||
float timestepFactor = Pow(0.99f, CTimer::GetTimeStep());
|
float timestepFactor = Pow(0.99f, CTimer::GetTimeStep());
|
||||||
dontCollideWithCars = (timestepFactor * dontCollideWithCars) + ((1.0f - timestepFactor) * car->m_vecMoveSpeed.Magnitude());
|
dontCollideWithCars = (timestepFactor * dontCollideWithCars) + ((1.0f - timestepFactor) * car->m_vecMoveSpeed.Magnitude());
|
||||||
|
|
||||||
// Move cam if on collision
|
// Our addition
|
||||||
CColPoint foundCol;
|
#define IS_TRAFFIC_LIGHT(ent) (ent->IsObject() && (IsStreetLight(ent->GetModelIndex())))
|
||||||
CEntity* foundEnt;
|
|
||||||
|
// Clip Source and fix near clip
|
||||||
|
CColPoint colPoint;
|
||||||
|
CEntity* entity;
|
||||||
CWorld::pIgnoreEntity = CamTargetEntity;
|
CWorld::pIgnoreEntity = CamTargetEntity;
|
||||||
if (CWorld::ProcessLineOfSight(TargetCoors, Source, foundCol, foundEnt, true, dontCollideWithCars < 0.1f, false, false, false, true, false)) {
|
if(CWorld::ProcessLineOfSight(TargetCoors, Source, colPoint, entity, true, dontCollideWithCars < 0.1f, false, true, false, true, true) && !IS_TRAFFIC_LIGHT(entity)){
|
||||||
float obstacleTargetDist = (TargetCoors - foundCol.point).Magnitude();
|
float PedColDist = (TargetCoors - colPoint.point).Magnitude();
|
||||||
float obstacleCamDist = newDistance - obstacleTargetDist;
|
float ColCamDist = newDistance - PedColDist;
|
||||||
if (!foundEnt->IsPed() || obstacleCamDist <= 1.0f) {
|
if(entity->IsPed() && ColCamDist > DEFAULT_NEAR + 0.1f){
|
||||||
Source = foundCol.point;
|
// Ped in the way but not clipping through
|
||||||
if (obstacleTargetDist < 1.2f) {
|
if(CWorld::ProcessLineOfSight(colPoint.point, Source, colPoint, entity, true, dontCollideWithCars < 0.1f, false, true, false, true, true) || IS_TRAFFIC_LIGHT(entity)){
|
||||||
RwCameraSetNearClipPlane(Scene.camera, Max(0.05f, obstacleTargetDist - 0.3f));
|
PedColDist = (TargetCoors - colPoint.point).Magnitude();
|
||||||
|
Source = colPoint.point;
|
||||||
|
if(PedColDist < DEFAULT_NEAR + 0.3f)
|
||||||
|
RwCameraSetNearClipPlane(Scene.camera, Max(PedColDist-0.3f, 0.05f));
|
||||||
|
}else{
|
||||||
|
RwCameraSetNearClipPlane(Scene.camera, Min(ColCamDist-0.35f, DEFAULT_NEAR));
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
if (!CWorld::ProcessLineOfSight(foundCol.point, Source, foundCol, foundEnt, true, dontCollideWithCars < 0.1f, false, false, false, true, false)) {
|
Source = colPoint.point;
|
||||||
float lessClip = obstacleCamDist - 0.35f;
|
if(PedColDist < DEFAULT_NEAR + 0.3f)
|
||||||
if (lessClip <= DEFAULT_NEAR)
|
RwCameraSetNearClipPlane(Scene.camera, Max(PedColDist-0.3f, 0.05f));
|
||||||
RwCameraSetNearClipPlane(Scene.camera, lessClip);
|
|
||||||
else
|
|
||||||
RwCameraSetNearClipPlane(Scene.camera, DEFAULT_NEAR);
|
|
||||||
} else {
|
|
||||||
obstacleTargetDist = (TargetCoors - foundCol.point).Magnitude();
|
|
||||||
Source = foundCol.point;
|
|
||||||
if (obstacleTargetDist < 1.2f) {
|
|
||||||
float lessClip = obstacleTargetDist - 0.3f;
|
|
||||||
if (lessClip >= 0.05f)
|
|
||||||
RwCameraSetNearClipPlane(Scene.camera, lessClip);
|
|
||||||
else
|
|
||||||
RwCameraSetNearClipPlane(Scene.camera, 0.05f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CWorld::pIgnoreEntity = nil;
|
CWorld::pIgnoreEntity = nil;
|
||||||
float nearClip = RwCameraGetNearClipPlane(Scene.camera);
|
|
||||||
float radius = Tan(DEGTORAD(FOV * 0.5f)) * CDraw::GetAspectRatio() * 1.1f;
|
|
||||||
|
|
||||||
// If we're seeing blue hell due to camera intersects some surface, fix it.
|
// If we're seeing blue hell due to camera intersects some surface, fix it.
|
||||||
// SA and LCS have this unrolled.
|
// SA and LCS have this unrolled.
|
||||||
for (int i = 0;
|
|
||||||
i <= 5 && CWorld::TestSphereAgainstWorld((nearClip * Front) + Source, radius * nearClip, nil, true, true, false, true, false, false);
|
|
||||||
i++) {
|
|
||||||
|
|
||||||
CVector surfaceCamDist = gaTempSphereColPoints->point - Source;
|
float ViewPlaneHeight = Tan(DEGTORAD(FOV) / 2.0f);
|
||||||
CVector frontButInvertedIfTouchesSurface = DotProduct(surfaceCamDist, Front) * Front;
|
float ViewPlaneWidth = ViewPlaneHeight * CDraw::FindAspectRatio() * fTweakFOV;
|
||||||
float newNearClip = (surfaceCamDist - frontButInvertedIfTouchesSurface).Magnitude() / radius;
|
float Near = RwCameraGetNearClipPlane(Scene.camera);
|
||||||
|
float radius = ViewPlaneWidth*Near;
|
||||||
|
entity = CWorld::TestSphereAgainstWorld(Source + Front*Near, radius, nil, true, true, false, true, false, true);
|
||||||
|
int i = 0;
|
||||||
|
while(entity){
|
||||||
|
|
||||||
if (newNearClip > nearClip)
|
if (IS_TRAFFIC_LIGHT(entity))
|
||||||
newNearClip = nearClip;
|
break;
|
||||||
if (newNearClip < 0.1f)
|
|
||||||
newNearClip = 0.1f;
|
|
||||||
if (nearClip > newNearClip)
|
|
||||||
RwCameraSetNearClipPlane(Scene.camera, newNearClip);
|
|
||||||
|
|
||||||
if (newNearClip == 0.1f)
|
CVector CamToCol = gaTempSphereColPoints[0].point - Source;
|
||||||
|
float frontDist = DotProduct(CamToCol, Front);
|
||||||
|
float dist = (CamToCol - Front*frontDist).Magnitude() / ViewPlaneWidth;
|
||||||
|
|
||||||
|
// Try to decrease near clip
|
||||||
|
dist = Max(Min(Near, dist), 0.1f);
|
||||||
|
if(dist < Near)
|
||||||
|
RwCameraSetNearClipPlane(Scene.camera, dist);
|
||||||
|
|
||||||
|
// Move forward a bit
|
||||||
|
if(dist == 0.1f)
|
||||||
Source += (TargetCoors - Source)*0.3f;
|
Source += (TargetCoors - Source)*0.3f;
|
||||||
|
|
||||||
nearClip = RwCameraGetNearClipPlane(Scene.camera);
|
// Keep testing
|
||||||
radius = Tan(DEGTORAD(FOV * 0.5f)) * CDraw::GetAspectRatio() * 1.1f;
|
Near = RwCameraGetNearClipPlane(Scene.camera);
|
||||||
|
radius = ViewPlaneWidth*Near;
|
||||||
|
entity = CWorld::TestSphereAgainstWorld(Source + Front*Near, radius, nil, true, true, false, true, false, true);
|
||||||
|
|
||||||
|
i++;
|
||||||
|
if(i > 5)
|
||||||
|
entity = nil;
|
||||||
}
|
}
|
||||||
|
#undef IS_TRAFFIC_LIGHT
|
||||||
}
|
}
|
||||||
TheCamera.m_bCamDirectlyBehind = false;
|
TheCamera.m_bCamDirectlyBehind = false;
|
||||||
TheCamera.m_bCamDirectlyInFront = false;
|
TheCamera.m_bCamDirectlyInFront = false;
|
||||||
|
@ -1065,7 +1065,7 @@ CFileLoader::LoadMLOInstance(int id, const char *line)
|
|||||||
&rot.x, &rot.y, &rot.z,
|
&rot.x, &rot.y, &rot.z,
|
||||||
&angle);
|
&angle);
|
||||||
float rad = Acos(angle) * 2.0f;
|
float rad = Acos(angle) * 2.0f;
|
||||||
CInstance *inst = CModelInfo::GetMloInstanceStore().alloc();
|
CInstance *inst = CModelInfo::GetMloInstanceStore().Alloc();
|
||||||
minfo->lastInstance++;
|
minfo->lastInstance++;
|
||||||
|
|
||||||
RwMatrix *matrix = RwMatrixCreate();
|
RwMatrix *matrix = RwMatrixCreate();
|
||||||
@ -1305,7 +1305,7 @@ CFileLoader::Load2dEffect(const char *line)
|
|||||||
CTxdStore::SetCurrentTxd(CTxdStore::FindTxdSlot("particle"));
|
CTxdStore::SetCurrentTxd(CTxdStore::FindTxdSlot("particle"));
|
||||||
|
|
||||||
mi = CModelInfo::GetModelInfo(id);
|
mi = CModelInfo::GetModelInfo(id);
|
||||||
effect = CModelInfo::Get2dEffectStore().alloc();
|
effect = CModelInfo::Get2dEffectStore().Alloc();
|
||||||
mi->Add2dEffect(effect);
|
mi->Add2dEffect(effect);
|
||||||
effect->pos = CVector(x, y, z);
|
effect->pos = CVector(x, y, z);
|
||||||
effect->col = CRGBA(r, g, b, a);
|
effect->col = CRGBA(r, g, b, a);
|
||||||
|
@ -90,7 +90,11 @@ CFire::ProcessFire(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!FindPlayerVehicle() && !FindPlayerPed()->m_pFire && !(FindPlayerPed()->bFireProof)
|
if (!FindPlayerVehicle() &&
|
||||||
|
#ifdef FIX_BUGS
|
||||||
|
FindPlayerPed() &&
|
||||||
|
#endif
|
||||||
|
!FindPlayerPed()->m_pFire && !(FindPlayerPed()->bFireProof)
|
||||||
&& ((FindPlayerPed()->GetPosition() - m_vecPos).MagnitudeSqr() < 2.0f)) {
|
&& ((FindPlayerPed()->GetPosition() - m_vecPos).MagnitudeSqr() < 2.0f)) {
|
||||||
FindPlayerPed()->DoStuffToGoOnFire();
|
FindPlayerPed()->DoStuffToGoOnFire();
|
||||||
gFireManager.StartFire(FindPlayerPed(), m_pSource, 0.8f, 1);
|
gFireManager.StartFire(FindPlayerPed(), m_pSource, 0.8f, 1);
|
||||||
@ -224,7 +228,7 @@ CFireManager::StartFire(CEntity *entityOnFire, CEntity *fleeFrom, float strength
|
|||||||
ped->bDrawLast = false;
|
ped->bDrawLast = false;
|
||||||
ped->SetMoveState(PEDMOVE_SPRINT);
|
ped->SetMoveState(PEDMOVE_SPRINT);
|
||||||
ped->SetMoveAnim();
|
ped->SetMoveAnim();
|
||||||
ped->m_nPedState = PED_ON_FIRE;
|
ped->SetPedState(PED_ON_FIRE);
|
||||||
}
|
}
|
||||||
if (fleeFrom) {
|
if (fleeFrom) {
|
||||||
if (ped->m_nPedType == PEDTYPE_COP) {
|
if (ped->m_nPedType == PEDTYPE_COP) {
|
||||||
@ -397,7 +401,7 @@ CFireManager::StartScriptFire(const CVector &pos, CEntity *target, float strengt
|
|||||||
CVector2D pos = target->GetPosition();
|
CVector2D pos = target->GetPosition();
|
||||||
ped->SetFlee(pos, 10000);
|
ped->SetFlee(pos, 10000);
|
||||||
ped->SetMoveAnim();
|
ped->SetMoveAnim();
|
||||||
ped->m_nPedState = PED_ON_FIRE;
|
ped->SetPedState(PED_ON_FIRE);
|
||||||
}
|
}
|
||||||
} else if (target->IsVehicle()) {
|
} else if (target->IsVehicle()) {
|
||||||
veh->m_pCarFire = fire;
|
veh->m_pCarFire = fire;
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -25,15 +25,18 @@
|
|||||||
#define MENUSLIDER_X 256.0f
|
#define MENUSLIDER_X 256.0f
|
||||||
#define MENUSLIDER_UNK 256.0f
|
#define MENUSLIDER_UNK 256.0f
|
||||||
|
|
||||||
#define BIGTEXT_X_SCALE 0.75f
|
#define BIGTEXT_X_SCALE 0.75f // For FONT_HEADING
|
||||||
#define BIGTEXT_Y_SCALE 0.9f
|
#define BIGTEXT_Y_SCALE 0.9f
|
||||||
#define MEDIUMTEXT_X_SCALE 0.55f
|
#define MEDIUMTEXT_X_SCALE 0.55f // For FONT_HEADING
|
||||||
#define MEDIUMTEXT_Y_SCALE 0.8f
|
#define MEDIUMTEXT_Y_SCALE 0.8f
|
||||||
#define SMALLTEXT_X_SCALE 0.45f
|
#define SMALLTEXT_X_SCALE 0.45f // used for FONT_HEADING and FONT_BANK, but looks off for HEADING
|
||||||
#define SMALLTEXT_Y_SCALE 0.7f
|
#define SMALLTEXT_Y_SCALE 0.7f
|
||||||
#define SMALLESTTEXT_X_SCALE 0.4f
|
#define SMALLESTTEXT_X_SCALE 0.4f // used for both FONT_HEADING and FONT_BANK
|
||||||
#define SMALLESTTEXT_Y_SCALE 0.6f
|
#define SMALLESTTEXT_Y_SCALE 0.6f
|
||||||
|
|
||||||
|
#define HELPER_TEXT_LEFT_MARGIN 320.0f
|
||||||
|
#define HELPER_TEXT_BOTTOM_MARGIN 120.0f
|
||||||
|
|
||||||
#define PLAYERSETUP_LIST_TOP 28.0f
|
#define PLAYERSETUP_LIST_TOP 28.0f
|
||||||
#define PLAYERSETUP_LIST_BOTTOM 125.0f
|
#define PLAYERSETUP_LIST_BOTTOM 125.0f
|
||||||
#define PLAYERSETUP_LIST_LEFT 200.0f
|
#define PLAYERSETUP_LIST_LEFT 200.0f
|
||||||
@ -45,8 +48,6 @@
|
|||||||
#endif
|
#endif
|
||||||
#define PLAYERSETUP_SCROLLBUTTON_HEIGHT 17.0f
|
#define PLAYERSETUP_SCROLLBUTTON_HEIGHT 17.0f
|
||||||
#define PLAYERSETUP_SCROLLBUTTON_TXD_DIMENSION 64
|
#define PLAYERSETUP_SCROLLBUTTON_TXD_DIMENSION 64
|
||||||
#define PLAYERSETUP_ROW_TEXT_X_SCALE 0.4f
|
|
||||||
#define PLAYERSETUP_ROW_TEXT_Y_SCALE 0.6f
|
|
||||||
#define PLAYERSETUP_SKIN_COLUMN_LEFT 220.0f
|
#define PLAYERSETUP_SKIN_COLUMN_LEFT 220.0f
|
||||||
#define PLAYERSETUP_DATE_COLUMN_RIGHT 56.0f
|
#define PLAYERSETUP_DATE_COLUMN_RIGHT 56.0f
|
||||||
#define PLAYERSETUP_LIST_BODY_TOP 47
|
#define PLAYERSETUP_LIST_BODY_TOP 47
|
||||||
@ -241,8 +242,6 @@ enum eMenuScreen
|
|||||||
|
|
||||||
#ifdef GRAPHICS_MENU_OPTIONS
|
#ifdef GRAPHICS_MENU_OPTIONS
|
||||||
MENUPAGE_GRAPHICS_SETTINGS,
|
MENUPAGE_GRAPHICS_SETTINGS,
|
||||||
#else
|
|
||||||
MENUPAGE_ADVANCED_DISPLAY_SETTINGS,
|
|
||||||
#endif
|
#endif
|
||||||
#ifdef DONT_TRUST_RECOGNIZED_JOYSTICKS
|
#ifdef DONT_TRUST_RECOGNIZED_JOYSTICKS
|
||||||
MENUPAGE_DETECT_JOYSTICK,
|
MENUPAGE_DETECT_JOYSTICK,
|
||||||
@ -697,8 +696,6 @@ public:
|
|||||||
|
|
||||||
#ifdef MENU_MAP
|
#ifdef MENU_MAP
|
||||||
static bool bMenuMapActive;
|
static bool bMenuMapActive;
|
||||||
static bool bMapMouseShownOnce;
|
|
||||||
static bool bMapLoaded;
|
|
||||||
static float fMapSize;
|
static float fMapSize;
|
||||||
static float fMapCenterY;
|
static float fMapCenterY;
|
||||||
static float fMapCenterX;
|
static float fMapCenterX;
|
||||||
|
@ -5,7 +5,8 @@ enum eLevelName {
|
|||||||
LEVEL_GENERIC = 0,
|
LEVEL_GENERIC = 0,
|
||||||
LEVEL_INDUSTRIAL,
|
LEVEL_INDUSTRIAL,
|
||||||
LEVEL_COMMERCIAL,
|
LEVEL_COMMERCIAL,
|
||||||
LEVEL_SUBURBAN
|
LEVEL_SUBURBAN,
|
||||||
|
NUM_LEVELS
|
||||||
};
|
};
|
||||||
|
|
||||||
class CGame
|
class CGame
|
||||||
|
@ -399,7 +399,12 @@ CMenuScreenCustom aScreens[MENUPAGES] = {
|
|||||||
MENUACTION_SCREENRES, "FED_RES", { nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS },
|
MENUACTION_SCREENRES, "FED_RES", { nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS },
|
||||||
VIDEOMODE_SELECTOR
|
VIDEOMODE_SELECTOR
|
||||||
MULTISAMPLING_SELECTOR
|
MULTISAMPLING_SELECTOR
|
||||||
MENUACTION_CHANGEMENU, "FET_ADV", { nil, SAVESLOT_NONE, MENUPAGE_ADVANCED_DISPLAY_SETTINGS },
|
ISLAND_LOADING_SELECTOR
|
||||||
|
DUALPASS_SELECTOR
|
||||||
|
CUTSCENE_BORDERS_TOGGLE
|
||||||
|
FREE_CAM_TOGGLE
|
||||||
|
POSTFX_SELECTORS
|
||||||
|
PIPELINES_SELECTOR
|
||||||
MENUACTION_RESTOREDEF, "FET_DEF", { nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS },
|
MENUACTION_RESTOREDEF, "FET_DEF", { nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS },
|
||||||
MENUACTION_CHANGEMENU, "FEDS_TB", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
MENUACTION_CHANGEMENU, "FEDS_TB", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||||
},
|
},
|
||||||
@ -829,31 +834,12 @@ CMenuScreenCustom aScreens[MENUPAGES] = {
|
|||||||
#else
|
#else
|
||||||
MENUACTION_TRAILS, "FED_TRA", { nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS },
|
MENUACTION_TRAILS, "FED_TRA", { nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS },
|
||||||
#endif
|
#endif
|
||||||
#ifdef EXTENDED_PIPELINES
|
|
||||||
PIPELINES_SELECTOR
|
PIPELINES_SELECTOR
|
||||||
#endif
|
|
||||||
ISLAND_LOADING_SELECTOR
|
ISLAND_LOADING_SELECTOR
|
||||||
DUALPASS_SELECTOR
|
DUALPASS_SELECTOR
|
||||||
MENUACTION_CFO_DYNAMIC, "FET_DEF", { new CCFODynamic(nil, nil, nil, RestoreDefGraphics) },
|
MENUACTION_CFO_DYNAMIC, "FET_DEF", { new CCFODynamic(nil, nil, nil, RestoreDefGraphics) },
|
||||||
MENUACTION_CHANGEMENU, "FEDS_TB", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
MENUACTION_CHANGEMENU, "FEDS_TB", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
||||||
},
|
},
|
||||||
#else
|
|
||||||
// MENUPAGE_ADVANCED_DISPLAY_SETTINGS
|
|
||||||
{ "FET_ADV", MENUPAGE_OPTIONS, MENUPAGE_OPTIONS,
|
|
||||||
new CCustomScreenLayout({MENUSPRITE_MAINMENU, 50, 0, 20, FONT_HEADING, FESCREEN_LEFT_ALIGN, true, MEDIUMTEXT_X_SCALE, MEDIUMTEXT_Y_SCALE}), nil,
|
|
||||||
|
|
||||||
ISLAND_LOADING_SELECTOR
|
|
||||||
DUALPASS_SELECTOR
|
|
||||||
CUTSCENE_BORDERS_TOGGLE
|
|
||||||
FREE_CAM_TOGGLE
|
|
||||||
#ifdef EXTENDED_COLOURFILTER
|
|
||||||
POSTFX_SELECTORS
|
|
||||||
#endif
|
|
||||||
#ifdef EXTENDED_PIPELINES
|
|
||||||
PIPELINES_SELECTOR
|
|
||||||
#endif
|
|
||||||
MENUACTION_CHANGEMENU, "FEDS_TB", { nil, SAVESLOT_NONE, MENUPAGE_NONE },
|
|
||||||
},
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DONT_TRUST_RECOGNIZED_JOYSTICKS
|
#ifdef DONT_TRUST_RECOGNIZED_JOYSTICKS
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
#include "Automobile.h"
|
#include "Automobile.h"
|
||||||
#include "Bridge.h"
|
#include "Bridge.h"
|
||||||
#include "Camera.h"
|
#include "Camera.h"
|
||||||
|
#include "CarCtrl.h"
|
||||||
#include "Cranes.h"
|
#include "Cranes.h"
|
||||||
#include "Darkel.h"
|
#include "Darkel.h"
|
||||||
#include "Explosion.h"
|
#include "Explosion.h"
|
||||||
@ -31,83 +32,6 @@
|
|||||||
#include "ZoneCull.h"
|
#include "ZoneCull.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
|
|
||||||
void
|
|
||||||
CPlayerInfo::SetPlayerSkin(char *skin)
|
|
||||||
{
|
|
||||||
strncpy(m_aSkinName, skin, 32);
|
|
||||||
LoadPlayerSkin();
|
|
||||||
}
|
|
||||||
|
|
||||||
const CVector &
|
|
||||||
CPlayerInfo::GetPos()
|
|
||||||
{
|
|
||||||
#ifdef FIX_BUGS
|
|
||||||
if (!m_pPed)
|
|
||||||
return TheCamera.GetPosition();
|
|
||||||
#endif
|
|
||||||
if (m_pPed->InVehicle())
|
|
||||||
return m_pPed->m_pMyVehicle->GetPosition();
|
|
||||||
return m_pPed->GetPosition();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CPlayerInfo::LoadPlayerSkin()
|
|
||||||
{
|
|
||||||
DeletePlayerSkin();
|
|
||||||
|
|
||||||
m_pSkinTexture = CPlayerSkin::GetSkinTexture(m_aSkinName);
|
|
||||||
if (!m_pSkinTexture)
|
|
||||||
m_pSkinTexture = CPlayerSkin::GetSkinTexture(DEFAULT_SKIN_NAME);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CPlayerInfo::DeletePlayerSkin()
|
|
||||||
{
|
|
||||||
if (m_pSkinTexture) {
|
|
||||||
RwTextureDestroy(m_pSkinTexture);
|
|
||||||
m_pSkinTexture = nil;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CPlayerInfo::KillPlayer()
|
|
||||||
{
|
|
||||||
if (m_WBState != WBSTATE_PLAYING) return;
|
|
||||||
|
|
||||||
m_WBState = WBSTATE_WASTED;
|
|
||||||
m_nWBTime = CTimer::GetTimeInMilliseconds();
|
|
||||||
CDarkel::ResetOnPlayerDeath();
|
|
||||||
CMessages::AddBigMessage(TheText.Get("DEAD"), 4000, 2);
|
|
||||||
CStats::TimesDied++;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CPlayerInfo::ArrestPlayer()
|
|
||||||
{
|
|
||||||
if (m_WBState != WBSTATE_PLAYING) return;
|
|
||||||
|
|
||||||
m_WBState = WBSTATE_BUSTED;
|
|
||||||
m_nWBTime = CTimer::GetTimeInMilliseconds();
|
|
||||||
CDarkel::ResetOnPlayerDeath();
|
|
||||||
CMessages::AddBigMessage(TheText.Get("BUSTED"), 5000, 2);
|
|
||||||
CStats::TimesArrested++;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
CPlayerInfo::IsPlayerInRemoteMode()
|
|
||||||
{
|
|
||||||
return m_pRemoteVehicle || m_bInRemoteMode;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CPlayerInfo::PlayerFailedCriticalMission()
|
|
||||||
{
|
|
||||||
if (m_WBState != WBSTATE_PLAYING)
|
|
||||||
return;
|
|
||||||
m_WBState = WBSTATE_FAILED_CRITICAL_MISSION;
|
|
||||||
m_nWBTime = CTimer::GetTimeInMilliseconds();
|
|
||||||
CDarkel::ResetOnPlayerDeath();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
CPlayerInfo::Clear(void)
|
CPlayerInfo::Clear(void)
|
||||||
@ -146,197 +70,6 @@ CPlayerInfo::Clear(void)
|
|||||||
m_nExplosionsSinceLastReward = 0;
|
m_nExplosionsSinceLastReward = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
CPlayerInfo::BlowUpRCBuggy(void)
|
|
||||||
{
|
|
||||||
if (!m_pRemoteVehicle || m_pRemoteVehicle->bRemoveFromWorld)
|
|
||||||
return;
|
|
||||||
|
|
||||||
CRemote::TakeRemoteControlledCarFromPlayer();
|
|
||||||
m_pRemoteVehicle->BlowUpCar(FindPlayerPed());
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CPlayerInfo::CancelPlayerEnteringCars(CVehicle *car)
|
|
||||||
{
|
|
||||||
if (!car || car == m_pPed->m_pMyVehicle) {
|
|
||||||
if (m_pPed->EnteringCar())
|
|
||||||
m_pPed->QuitEnteringCar();
|
|
||||||
}
|
|
||||||
if (m_pPed->m_objective == OBJECTIVE_ENTER_CAR_AS_PASSENGER || m_pPed->m_objective == OBJECTIVE_ENTER_CAR_AS_DRIVER)
|
|
||||||
m_pPed->ClearObjective();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CPlayerInfo::MakePlayerSafe(bool toggle)
|
|
||||||
{
|
|
||||||
if (toggle) {
|
|
||||||
CTheScripts::ResetCountdownToMakePlayerUnsafe();
|
|
||||||
m_pPed->m_pWanted->m_bIgnoredByEveryone = true;
|
|
||||||
CWorld::StopAllLawEnforcersInTheirTracks();
|
|
||||||
CPad::GetPad(0)->SetDisablePlayerControls(PLAYERCONTROL_PLAYERINFO);
|
|
||||||
CPad::StopPadsShaking();
|
|
||||||
m_pPed->bBulletProof = true;
|
|
||||||
m_pPed->bFireProof = true;
|
|
||||||
m_pPed->bCollisionProof = true;
|
|
||||||
m_pPed->bMeleeProof = true;
|
|
||||||
m_pPed->bOnlyDamagedByPlayer = true;
|
|
||||||
m_pPed->bExplosionProof = true;
|
|
||||||
m_pPed->m_bCanBeDamaged = false;
|
|
||||||
((CPlayerPed*)m_pPed)->ClearAdrenaline();
|
|
||||||
CancelPlayerEnteringCars(nil);
|
|
||||||
gFireManager.ExtinguishPoint(GetPos(), 4000.0f);
|
|
||||||
CExplosion::RemoveAllExplosionsInArea(GetPos(), 4000.0f);
|
|
||||||
CProjectileInfo::RemoveAllProjectiles();
|
|
||||||
CWorld::SetAllCarsCanBeDamaged(false);
|
|
||||||
CWorld::ExtinguishAllCarFiresInArea(GetPos(), 4000.0f);
|
|
||||||
CReplay::DisableReplays();
|
|
||||||
|
|
||||||
} else if (!CGame::playingIntro && !CTheScripts::IsCountdownToMakePlayerUnsafeOn()) {
|
|
||||||
m_pPed->m_pWanted->m_bIgnoredByEveryone = false;
|
|
||||||
CPad::GetPad(0)->SetEnablePlayerControls(PLAYERCONTROL_PLAYERINFO);
|
|
||||||
m_pPed->bBulletProof = false;
|
|
||||||
m_pPed->bFireProof = false;
|
|
||||||
m_pPed->bCollisionProof = false;
|
|
||||||
m_pPed->bMeleeProof = false;
|
|
||||||
m_pPed->bOnlyDamagedByPlayer = false;
|
|
||||||
m_pPed->bExplosionProof = false;
|
|
||||||
m_pPed->m_bCanBeDamaged = true;
|
|
||||||
CWorld::SetAllCarsCanBeDamaged(true);
|
|
||||||
CReplay::EnableReplays();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
CPlayerInfo::IsRestartingAfterDeath()
|
|
||||||
{
|
|
||||||
return m_WBState == WBSTATE_WASTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
CPlayerInfo::IsRestartingAfterArrest()
|
|
||||||
{
|
|
||||||
return m_WBState == WBSTATE_BUSTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
// lastCloseness is passed to other calls of this function
|
|
||||||
void
|
|
||||||
CPlayerInfo::EvaluateCarPosition(CEntity *carToTest, CPed *player, float carBoundCentrePedDist, float *lastCloseness, CVehicle **closestCarOutput)
|
|
||||||
{
|
|
||||||
// This dist used for determining the angle to face
|
|
||||||
CVector2D dist(carToTest->GetPosition() - player->GetPosition());
|
|
||||||
float neededTurn = CGeneral::GetATanOfXY(player->GetForward().x, player->GetForward().y) - CGeneral::GetATanOfXY(dist.x, dist.y);
|
|
||||||
while (neededTurn >= PI) {
|
|
||||||
neededTurn -= 2 * PI;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (neededTurn < -PI) {
|
|
||||||
neededTurn += 2 * PI;
|
|
||||||
}
|
|
||||||
|
|
||||||
// This dist used for evaluating cars' distances, weird...
|
|
||||||
// Accounts inverted needed turn (or needed turn in long way) and car dist.
|
|
||||||
float closeness = (1.0f - Abs(neededTurn) / TWOPI) * (10.0f - carBoundCentrePedDist);
|
|
||||||
if (closeness > *lastCloseness) {
|
|
||||||
*lastCloseness = closeness;
|
|
||||||
*closestCarOutput = (CVehicle*)carToTest;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// There is something unfinished in here... Sadly all IDBs we have have it unfinished.
|
|
||||||
void
|
|
||||||
CPlayerInfo::AwardMoneyForExplosion(CVehicle *wreckedCar)
|
|
||||||
{
|
|
||||||
if (CTimer::GetTimeInMilliseconds() - m_nPreviousTimeRewardedForExplosion < 6000)
|
|
||||||
++m_nExplosionsSinceLastReward;
|
|
||||||
else
|
|
||||||
m_nExplosionsSinceLastReward = 1;
|
|
||||||
|
|
||||||
m_nPreviousTimeRewardedForExplosion = CTimer::GetTimeInMilliseconds();
|
|
||||||
int award = wreckedCar->pHandling->nMonetaryValue * 0.002f;
|
|
||||||
sprintf(gString, "$%d", award);
|
|
||||||
#ifdef MONEY_MESSAGES
|
|
||||||
// This line is a leftover from PS2, I don't know what it was meant to be.
|
|
||||||
// CVector sth(TheCamera.GetPosition() * 4.0f);
|
|
||||||
|
|
||||||
CMoneyMessages::RegisterOne(wreckedCar->GetPosition() + CVector(0.0f, 0.0f, 2.0f), gString, 0, 255, 0, 2.0f, 0.5f);
|
|
||||||
#endif
|
|
||||||
CWorld::Players[CWorld::PlayerInFocus].m_nMoney += award;
|
|
||||||
|
|
||||||
for (int i = m_nExplosionsSinceLastReward; i > 1; --i) {
|
|
||||||
CGeneral::GetRandomNumber();
|
|
||||||
CWorld::Players[CWorld::PlayerInFocus].m_nMoney += award;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CPlayerInfo::SavePlayerInfo(uint8 *buf, uint32 *size)
|
|
||||||
{
|
|
||||||
// Interesting
|
|
||||||
*size = sizeof(CPlayerInfo);
|
|
||||||
|
|
||||||
#define CopyToBuf(buf, data) memcpy(buf, &data, sizeof(data)); buf += sizeof(data);
|
|
||||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nMoney);
|
|
||||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_WBState);
|
|
||||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nWBTime);
|
|
||||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nTrafficMultiplier);
|
|
||||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_fRoadDensity);
|
|
||||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nVisibleMoney);
|
|
||||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nCollectedPackages);
|
|
||||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nTotalPackages);
|
|
||||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bInfiniteSprint);
|
|
||||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bFastReload);
|
|
||||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bGetOutOfJailFree);
|
|
||||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bGetOutOfHospitalFree);
|
|
||||||
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_aPlayerName);
|
|
||||||
#undef CopyToBuf
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CPlayerInfo::LoadPlayerInfo(uint8 *buf, uint32 size)
|
|
||||||
{
|
|
||||||
#define CopyFromBuf(buf, data) memcpy(&data, buf, sizeof(data)); buf += sizeof(data);
|
|
||||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nMoney);
|
|
||||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_WBState);
|
|
||||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nWBTime);
|
|
||||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nTrafficMultiplier);
|
|
||||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_fRoadDensity);
|
|
||||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nVisibleMoney);
|
|
||||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nCollectedPackages);
|
|
||||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nTotalPackages);
|
|
||||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bInfiniteSprint);
|
|
||||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bFastReload);
|
|
||||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bGetOutOfJailFree);
|
|
||||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bGetOutOfHospitalFree);
|
|
||||||
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_aPlayerName)
|
|
||||||
#undef CopyFromBuf
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CPlayerInfo::FindClosestCarSectorList(CPtrList& carList, CPed* ped, float unk1, float unk2, float unk3, float unk4, float* lastCloseness, CVehicle** closestCarOutput)
|
|
||||||
{
|
|
||||||
for (CPtrNode* node = carList.first; node; node = node->next) {
|
|
||||||
CVehicle *car = (CVehicle*)node->item;
|
|
||||||
if(car->m_scanCode != CWorld::GetCurrentScanCode()) {
|
|
||||||
if (!car->bUsesCollision || !car->IsVehicle())
|
|
||||||
continue;
|
|
||||||
|
|
||||||
car->m_scanCode = CWorld::GetCurrentScanCode();
|
|
||||||
if (car->GetStatus() != STATUS_WRECKED && car->GetStatus() != STATUS_TRAIN_MOVING
|
|
||||||
&& (car->GetUp().z > 0.3f || (car->IsVehicle() && ((CVehicle*)car)->m_vehType == VEHICLE_TYPE_BIKE))) {
|
|
||||||
CVector carCentre = car->GetBoundCentre();
|
|
||||||
|
|
||||||
if (Abs(ped->GetPosition().z - carCentre.z) < 2.0f) {
|
|
||||||
float dist = (ped->GetPosition() - carCentre).Magnitude2D();
|
|
||||||
if (dist <= 10.0f && !CCranes::IsThisCarBeingCarriedByAnyCrane(car)) {
|
|
||||||
EvaluateCarPosition(car, ped, dist, lastCloseness, closestCarOutput);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
CPlayerInfo::Process(void)
|
CPlayerInfo::Process(void)
|
||||||
{
|
{
|
||||||
@ -419,7 +152,7 @@ CPlayerInfo::Process(void)
|
|||||||
|
|
||||||
if (found)
|
if (found)
|
||||||
sth.z = 1.0f + groundZ;
|
sth.z = 1.0f + groundZ;
|
||||||
m_pPed->m_nPedState = PED_IDLE;
|
m_pPed->SetPedState(PED_IDLE);
|
||||||
m_pPed->SetMoveState(PEDMOVE_STILL);
|
m_pPed->SetMoveState(PEDMOVE_STILL);
|
||||||
CPed::PedSetOutCarCB(0, m_pPed);
|
CPed::PedSetOutCarCB(0, m_pPed);
|
||||||
CAnimManager::BlendAnimation(m_pPed->GetClump(), m_pPed->m_animGroup, ANIM_IDLE_STANCE, 100.0f);
|
CAnimManager::BlendAnimation(m_pPed->GetClump(), m_pPed->m_animGroup, ANIM_IDLE_STANCE, 100.0f);
|
||||||
@ -503,13 +236,13 @@ CPlayerInfo::Process(void)
|
|||||||
uint32 timeWithoutRemoteCar = CTimer::GetTimeInMilliseconds() - m_nTimeLostRemoteCar;
|
uint32 timeWithoutRemoteCar = CTimer::GetTimeInMilliseconds() - m_nTimeLostRemoteCar;
|
||||||
if (CTimer::GetPreviousTimeInMilliseconds() - m_nTimeLostRemoteCar < 1000 && timeWithoutRemoteCar >= 1000 && m_WBState == WBSTATE_PLAYING) {
|
if (CTimer::GetPreviousTimeInMilliseconds() - m_nTimeLostRemoteCar < 1000 && timeWithoutRemoteCar >= 1000 && m_WBState == WBSTATE_PLAYING) {
|
||||||
TheCamera.SetFadeColour(0, 0, 0);
|
TheCamera.SetFadeColour(0, 0, 0);
|
||||||
TheCamera.Fade(1.0f, 0);
|
TheCamera.Fade(1.0f, FADE_OUT);
|
||||||
}
|
}
|
||||||
if (timeWithoutRemoteCar > 2000) {
|
if (timeWithoutRemoteCar > 2000) {
|
||||||
if (m_WBState == WBSTATE_PLAYING) {
|
if (m_WBState == WBSTATE_PLAYING) {
|
||||||
TheCamera.RestoreWithJumpCut();
|
TheCamera.RestoreWithJumpCut();
|
||||||
TheCamera.SetFadeColour(0, 0, 0);
|
TheCamera.SetFadeColour(0, 0, 0);
|
||||||
TheCamera.Fade(1.0f, 1);
|
TheCamera.Fade(1.0f, FADE_IN);
|
||||||
TheCamera.Process();
|
TheCamera.Process();
|
||||||
CTimer::Stop();
|
CTimer::Stop();
|
||||||
CCullZones::ForceCullZoneCoors(TheCamera.GetPosition());
|
CCullZones::ForceCullZoneCoors(TheCamera.GetPosition());
|
||||||
@ -560,3 +293,370 @@ CPlayerInfo::Process(void)
|
|||||||
CStats::DistanceTravelledOnFoot += FindPlayerPed()->m_fDistanceTravelled;
|
CStats::DistanceTravelledOnFoot += FindPlayerPed()->m_fDistanceTravelled;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
CPlayerInfo::IsPlayerInRemoteMode()
|
||||||
|
{
|
||||||
|
return m_pRemoteVehicle || m_bInRemoteMode;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CPlayerInfo::SavePlayerInfo(uint8 *buf, uint32 *size)
|
||||||
|
{
|
||||||
|
// Interesting
|
||||||
|
*size = sizeof(CPlayerInfo);
|
||||||
|
|
||||||
|
#define CopyToBuf(buf, data) memcpy(buf, &data, sizeof(data)); buf += sizeof(data);
|
||||||
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nMoney);
|
||||||
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_WBState);
|
||||||
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nWBTime);
|
||||||
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nTrafficMultiplier);
|
||||||
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_fRoadDensity);
|
||||||
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nVisibleMoney);
|
||||||
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nCollectedPackages);
|
||||||
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nTotalPackages);
|
||||||
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bInfiniteSprint);
|
||||||
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bFastReload);
|
||||||
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bGetOutOfJailFree);
|
||||||
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bGetOutOfHospitalFree);
|
||||||
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_aPlayerName);
|
||||||
|
#undef CopyToBuf
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CPlayerInfo::LoadPlayerInfo(uint8 *buf, uint32 size)
|
||||||
|
{
|
||||||
|
#define CopyFromBuf(buf, data) memcpy(&data, buf, sizeof(data)); buf += sizeof(data);
|
||||||
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nMoney);
|
||||||
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_WBState);
|
||||||
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nWBTime);
|
||||||
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nTrafficMultiplier);
|
||||||
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_fRoadDensity);
|
||||||
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nVisibleMoney);
|
||||||
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nCollectedPackages);
|
||||||
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nTotalPackages);
|
||||||
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bInfiniteSprint);
|
||||||
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bFastReload);
|
||||||
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bGetOutOfJailFree);
|
||||||
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bGetOutOfHospitalFree);
|
||||||
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_aPlayerName)
|
||||||
|
#undef CopyFromBuf
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CPlayerInfo::FindClosestCarSectorList(CPtrList& carList, CPed* ped, float unk1, float unk2, float unk3, float unk4, float* lastCloseness, CVehicle** closestCarOutput)
|
||||||
|
{
|
||||||
|
for (CPtrNode* node = carList.first; node; node = node->next) {
|
||||||
|
CVehicle *car = (CVehicle*)node->item;
|
||||||
|
if(car->m_scanCode != CWorld::GetCurrentScanCode()) {
|
||||||
|
if (!car->bUsesCollision || !car->IsVehicle())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
car->m_scanCode = CWorld::GetCurrentScanCode();
|
||||||
|
if (car->GetStatus() != STATUS_WRECKED && car->GetStatus() != STATUS_TRAIN_MOVING
|
||||||
|
&& (car->GetUp().z > 0.3f || (car->IsVehicle() && ((CVehicle*)car)->m_vehType == VEHICLE_TYPE_BIKE))) {
|
||||||
|
CVector carCentre = car->GetBoundCentre();
|
||||||
|
|
||||||
|
if (Abs(ped->GetPosition().z - carCentre.z) < 2.0f) {
|
||||||
|
float dist = (ped->GetPosition() - carCentre).Magnitude2D();
|
||||||
|
if (dist <= 10.0f && !CCranes::IsThisCarBeingCarriedByAnyCrane(car)) {
|
||||||
|
EvaluateCarPosition(car, ped, dist, lastCloseness, closestCarOutput);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// lastCloseness is passed to other calls of this function
|
||||||
|
void
|
||||||
|
CPlayerInfo::EvaluateCarPosition(CEntity *carToTest, CPed *player, float carBoundCentrePedDist, float *lastCloseness, CVehicle **closestCarOutput)
|
||||||
|
{
|
||||||
|
// This dist used for determining the angle to face
|
||||||
|
CVector2D dist(carToTest->GetPosition() - player->GetPosition());
|
||||||
|
float neededTurn = CGeneral::GetATanOfXY(player->GetForward().x, player->GetForward().y) - CGeneral::GetATanOfXY(dist.x, dist.y);
|
||||||
|
while (neededTurn >= PI) {
|
||||||
|
neededTurn -= 2 * PI;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (neededTurn < -PI) {
|
||||||
|
neededTurn += 2 * PI;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This dist used for evaluating cars' distances, weird...
|
||||||
|
// Accounts inverted needed turn (or needed turn in long way) and car dist.
|
||||||
|
float closeness = (1.0f - Abs(neededTurn) / TWOPI) * (10.0f - carBoundCentrePedDist);
|
||||||
|
if (closeness > *lastCloseness) {
|
||||||
|
*lastCloseness = closeness;
|
||||||
|
*closestCarOutput = (CVehicle*)carToTest;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const CVector &
|
||||||
|
CPlayerInfo::GetPos()
|
||||||
|
{
|
||||||
|
#ifdef FIX_BUGS
|
||||||
|
if (!m_pPed)
|
||||||
|
return TheCamera.GetPosition();
|
||||||
|
#endif
|
||||||
|
if (m_pPed->InVehicle())
|
||||||
|
return m_pPed->m_pMyVehicle->GetPosition();
|
||||||
|
return m_pPed->GetPosition();
|
||||||
|
}
|
||||||
|
|
||||||
|
CVector
|
||||||
|
FindPlayerCoors(void)
|
||||||
|
{
|
||||||
|
#ifdef FIX_BUGS
|
||||||
|
if (CReplay::IsPlayingBack())
|
||||||
|
return TheCamera.GetPosition();
|
||||||
|
#endif
|
||||||
|
CPlayerPed *ped = FindPlayerPed();
|
||||||
|
if(ped->InVehicle())
|
||||||
|
return ped->m_pMyVehicle->GetPosition();
|
||||||
|
else
|
||||||
|
return ped->GetPosition();
|
||||||
|
}
|
||||||
|
|
||||||
|
const CVector &
|
||||||
|
FindPlayerSpeed(void)
|
||||||
|
{
|
||||||
|
#ifdef FIX_BUGS
|
||||||
|
static CVector vecTmpVector(0.0f, 0.0f, 0.0f);
|
||||||
|
if (CReplay::IsPlayingBack())
|
||||||
|
return vecTmpVector;
|
||||||
|
#endif
|
||||||
|
CPlayerPed *ped = FindPlayerPed();
|
||||||
|
if(ped->InVehicle())
|
||||||
|
return ped->m_pMyVehicle->m_vecMoveSpeed;
|
||||||
|
else
|
||||||
|
return ped->m_vecMoveSpeed;
|
||||||
|
}
|
||||||
|
|
||||||
|
CVehicle *
|
||||||
|
FindPlayerVehicle(void)
|
||||||
|
{
|
||||||
|
CPlayerPed *ped = FindPlayerPed();
|
||||||
|
if(ped && ped->InVehicle()) return ped->m_pMyVehicle;
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
CEntity *
|
||||||
|
FindPlayerEntity(void)
|
||||||
|
{
|
||||||
|
CPlayerPed *ped = FindPlayerPed();
|
||||||
|
if(ped->InVehicle())
|
||||||
|
return ped->m_pMyVehicle;
|
||||||
|
else
|
||||||
|
return ped;
|
||||||
|
}
|
||||||
|
|
||||||
|
CVehicle *
|
||||||
|
FindPlayerTrain(void)
|
||||||
|
{
|
||||||
|
if(FindPlayerVehicle() && FindPlayerVehicle()->IsTrain())
|
||||||
|
return FindPlayerVehicle();
|
||||||
|
else
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
CPlayerPed *
|
||||||
|
FindPlayerPed(void)
|
||||||
|
{
|
||||||
|
return CWorld::Players[CWorld::PlayerInFocus].m_pPed;
|
||||||
|
}
|
||||||
|
|
||||||
|
const CVector &
|
||||||
|
FindPlayerCentreOfWorld(int32 player)
|
||||||
|
{
|
||||||
|
#ifdef FIX_BUGS
|
||||||
|
if(CReplay::IsPlayingBack()) return TheCamera.GetPosition();
|
||||||
|
#endif
|
||||||
|
if(CCarCtrl::bCarsGeneratedAroundCamera) return TheCamera.GetPosition();
|
||||||
|
if(CWorld::Players[player].m_pRemoteVehicle) return CWorld::Players[player].m_pRemoteVehicle->GetPosition();
|
||||||
|
if(FindPlayerVehicle()) return FindPlayerVehicle()->GetPosition();
|
||||||
|
return CWorld::Players[player].m_pPed->GetPosition();
|
||||||
|
}
|
||||||
|
|
||||||
|
const CVector &
|
||||||
|
FindPlayerCentreOfWorld_NoSniperShift(void)
|
||||||
|
{
|
||||||
|
#ifdef FIX_BUGS
|
||||||
|
if (CReplay::IsPlayingBack()) return TheCamera.GetPosition();
|
||||||
|
#endif
|
||||||
|
if(CCarCtrl::bCarsGeneratedAroundCamera) return TheCamera.GetPosition();
|
||||||
|
if(CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle)
|
||||||
|
return CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle->GetPosition();
|
||||||
|
if(FindPlayerVehicle()) return FindPlayerVehicle()->GetPosition();
|
||||||
|
return FindPlayerPed()->GetPosition();
|
||||||
|
}
|
||||||
|
|
||||||
|
float
|
||||||
|
FindPlayerHeading(void)
|
||||||
|
{
|
||||||
|
if(CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle)
|
||||||
|
return CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle->GetForward().Heading();
|
||||||
|
if(FindPlayerVehicle()) return FindPlayerVehicle()->GetForward().Heading();
|
||||||
|
return FindPlayerPed()->GetForward().Heading();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
CPlayerInfo::IsRestartingAfterDeath()
|
||||||
|
{
|
||||||
|
return m_WBState == WBSTATE_WASTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
CPlayerInfo::IsRestartingAfterArrest()
|
||||||
|
{
|
||||||
|
return m_WBState == WBSTATE_BUSTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CPlayerInfo::KillPlayer()
|
||||||
|
{
|
||||||
|
if (m_WBState != WBSTATE_PLAYING) return;
|
||||||
|
|
||||||
|
m_WBState = WBSTATE_WASTED;
|
||||||
|
m_nWBTime = CTimer::GetTimeInMilliseconds();
|
||||||
|
CDarkel::ResetOnPlayerDeath();
|
||||||
|
CMessages::AddBigMessage(TheText.Get("DEAD"), 4000, 2);
|
||||||
|
CStats::TimesDied++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CPlayerInfo::ArrestPlayer()
|
||||||
|
{
|
||||||
|
if (m_WBState != WBSTATE_PLAYING) return;
|
||||||
|
|
||||||
|
m_WBState = WBSTATE_BUSTED;
|
||||||
|
m_nWBTime = CTimer::GetTimeInMilliseconds();
|
||||||
|
CDarkel::ResetOnPlayerDeath();
|
||||||
|
CMessages::AddBigMessage(TheText.Get("BUSTED"), 5000, 2);
|
||||||
|
CStats::TimesArrested++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CPlayerInfo::PlayerFailedCriticalMission()
|
||||||
|
{
|
||||||
|
if (m_WBState != WBSTATE_PLAYING)
|
||||||
|
return;
|
||||||
|
m_WBState = WBSTATE_FAILED_CRITICAL_MISSION;
|
||||||
|
m_nWBTime = CTimer::GetTimeInMilliseconds();
|
||||||
|
CDarkel::ResetOnPlayerDeath();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CPlayerInfo::CancelPlayerEnteringCars(CVehicle *car)
|
||||||
|
{
|
||||||
|
if (!car || car == m_pPed->m_pMyVehicle) {
|
||||||
|
if (m_pPed->EnteringCar())
|
||||||
|
m_pPed->QuitEnteringCar();
|
||||||
|
}
|
||||||
|
if (m_pPed->m_objective == OBJECTIVE_ENTER_CAR_AS_PASSENGER || m_pPed->m_objective == OBJECTIVE_ENTER_CAR_AS_DRIVER)
|
||||||
|
m_pPed->ClearObjective();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CPlayerInfo::MakePlayerSafe(bool toggle)
|
||||||
|
{
|
||||||
|
if (toggle) {
|
||||||
|
CTheScripts::ResetCountdownToMakePlayerUnsafe();
|
||||||
|
m_pPed->m_pWanted->m_bIgnoredByEveryone = true;
|
||||||
|
CWorld::StopAllLawEnforcersInTheirTracks();
|
||||||
|
CPad::GetPad(0)->SetDisablePlayerControls(PLAYERCONTROL_PLAYERINFO);
|
||||||
|
CPad::StopPadsShaking();
|
||||||
|
m_pPed->bBulletProof = true;
|
||||||
|
m_pPed->bFireProof = true;
|
||||||
|
m_pPed->bCollisionProof = true;
|
||||||
|
m_pPed->bMeleeProof = true;
|
||||||
|
m_pPed->bOnlyDamagedByPlayer = true;
|
||||||
|
m_pPed->bExplosionProof = true;
|
||||||
|
m_pPed->m_bCanBeDamaged = false;
|
||||||
|
((CPlayerPed*)m_pPed)->ClearAdrenaline();
|
||||||
|
CancelPlayerEnteringCars(nil);
|
||||||
|
gFireManager.ExtinguishPoint(GetPos(), 4000.0f);
|
||||||
|
CExplosion::RemoveAllExplosionsInArea(GetPos(), 4000.0f);
|
||||||
|
CProjectileInfo::RemoveAllProjectiles();
|
||||||
|
CWorld::SetAllCarsCanBeDamaged(false);
|
||||||
|
CWorld::ExtinguishAllCarFiresInArea(GetPos(), 4000.0f);
|
||||||
|
CReplay::DisableReplays();
|
||||||
|
|
||||||
|
} else if (!CGame::playingIntro && !CTheScripts::IsCountdownToMakePlayerUnsafeOn()) {
|
||||||
|
m_pPed->m_pWanted->m_bIgnoredByEveryone = false;
|
||||||
|
CPad::GetPad(0)->SetEnablePlayerControls(PLAYERCONTROL_PLAYERINFO);
|
||||||
|
m_pPed->bBulletProof = false;
|
||||||
|
m_pPed->bFireProof = false;
|
||||||
|
m_pPed->bCollisionProof = false;
|
||||||
|
m_pPed->bMeleeProof = false;
|
||||||
|
m_pPed->bOnlyDamagedByPlayer = false;
|
||||||
|
m_pPed->bExplosionProof = false;
|
||||||
|
m_pPed->m_bCanBeDamaged = true;
|
||||||
|
CWorld::SetAllCarsCanBeDamaged(true);
|
||||||
|
CReplay::EnableReplays();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CPlayerInfo::BlowUpRCBuggy(void)
|
||||||
|
{
|
||||||
|
if (!m_pRemoteVehicle || m_pRemoteVehicle->bRemoveFromWorld)
|
||||||
|
return;
|
||||||
|
|
||||||
|
CRemote::TakeRemoteControlledCarFromPlayer();
|
||||||
|
m_pRemoteVehicle->BlowUpCar(FindPlayerPed());
|
||||||
|
}
|
||||||
|
|
||||||
|
// There is something unfinished in here... Sadly all IDBs we have have it unfinished.
|
||||||
|
void
|
||||||
|
CPlayerInfo::AwardMoneyForExplosion(CVehicle *wreckedCar)
|
||||||
|
{
|
||||||
|
if (CTimer::GetTimeInMilliseconds() - m_nPreviousTimeRewardedForExplosion < 6000)
|
||||||
|
++m_nExplosionsSinceLastReward;
|
||||||
|
else
|
||||||
|
m_nExplosionsSinceLastReward = 1;
|
||||||
|
|
||||||
|
m_nPreviousTimeRewardedForExplosion = CTimer::GetTimeInMilliseconds();
|
||||||
|
int award = wreckedCar->pHandling->nMonetaryValue * 0.002f;
|
||||||
|
sprintf(gString, "$%d", award);
|
||||||
|
#ifdef MONEY_MESSAGES
|
||||||
|
// This line is a leftover from PS2, I don't know what it was meant to be.
|
||||||
|
// CVector sth(TheCamera.GetPosition() * 4.0f);
|
||||||
|
|
||||||
|
CMoneyMessages::RegisterOne(wreckedCar->GetPosition() + CVector(0.0f, 0.0f, 2.0f), gString, 0, 255, 0, 2.0f, 0.5f);
|
||||||
|
#endif
|
||||||
|
CWorld::Players[CWorld::PlayerInFocus].m_nMoney += award;
|
||||||
|
|
||||||
|
for (int i = m_nExplosionsSinceLastReward; i > 1; --i) {
|
||||||
|
CGeneral::GetRandomNumber();
|
||||||
|
CWorld::Players[CWorld::PlayerInFocus].m_nMoney += award;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef GTA_PC
|
||||||
|
void
|
||||||
|
CPlayerInfo::SetPlayerSkin(const char *skin)
|
||||||
|
{
|
||||||
|
strncpy(m_aSkinName, skin, 32);
|
||||||
|
LoadPlayerSkin();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CPlayerInfo::LoadPlayerSkin()
|
||||||
|
{
|
||||||
|
DeletePlayerSkin();
|
||||||
|
|
||||||
|
m_pSkinTexture = CPlayerSkin::GetSkinTexture(m_aSkinName);
|
||||||
|
if (!m_pSkinTexture)
|
||||||
|
m_pSkinTexture = CPlayerSkin::GetSkinTexture(DEFAULT_SKIN_NAME);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CPlayerInfo::DeletePlayerSkin()
|
||||||
|
{
|
||||||
|
if (m_pSkinTexture) {
|
||||||
|
RwTextureDestroy(m_pSkinTexture);
|
||||||
|
m_pSkinTexture = nil;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
@ -54,14 +54,13 @@ public:
|
|||||||
bool m_bFastReload;
|
bool m_bFastReload;
|
||||||
bool m_bGetOutOfJailFree;
|
bool m_bGetOutOfJailFree;
|
||||||
bool m_bGetOutOfHospitalFree;
|
bool m_bGetOutOfHospitalFree;
|
||||||
|
#ifdef GTA_PC
|
||||||
char m_aSkinName[32];
|
char m_aSkinName[32];
|
||||||
RwTexture *m_pSkinTexture;
|
RwTexture *m_pSkinTexture;
|
||||||
|
#endif
|
||||||
|
|
||||||
void MakePlayerSafe(bool);
|
void MakePlayerSafe(bool);
|
||||||
void LoadPlayerSkin();
|
|
||||||
void DeletePlayerSkin();
|
|
||||||
void AwardMoneyForExplosion(CVehicle *vehicle);
|
void AwardMoneyForExplosion(CVehicle *vehicle);
|
||||||
void SetPlayerSkin(char* skin);
|
|
||||||
const CVector &GetPos();
|
const CVector &GetPos();
|
||||||
void Process(void);
|
void Process(void);
|
||||||
void KillPlayer(void);
|
void KillPlayer(void);
|
||||||
@ -78,7 +77,21 @@ public:
|
|||||||
void SavePlayerInfo(uint8 *buf, uint32* size);
|
void SavePlayerInfo(uint8 *buf, uint32* size);
|
||||||
void FindClosestCarSectorList(CPtrList&, CPed*, float, float, float, float, float*, CVehicle**);
|
void FindClosestCarSectorList(CPtrList&, CPed*, float, float, float, float, float*, CVehicle**);
|
||||||
|
|
||||||
~CPlayerInfo() { };
|
#ifdef GTA_PC
|
||||||
|
void LoadPlayerSkin();
|
||||||
|
void SetPlayerSkin(const char *skin);
|
||||||
|
void DeletePlayerSkin();
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
CPlayerPed *FindPlayerPed(void);
|
||||||
|
CVehicle *FindPlayerVehicle(void);
|
||||||
|
CVehicle *FindPlayerTrain(void);
|
||||||
|
CEntity *FindPlayerEntity(void);
|
||||||
|
CVector FindPlayerCoors(void);
|
||||||
|
const CVector &FindPlayerSpeed(void);
|
||||||
|
const CVector &FindPlayerCentreOfWorld(int32 player);
|
||||||
|
const CVector &FindPlayerCentreOfWorld_NoSniperShift(void);
|
||||||
|
float FindPlayerHeading(void);
|
||||||
|
|
||||||
VALIDATE_SIZE(CPlayerInfo, 0x13C);
|
VALIDATE_SIZE(CPlayerInfo, 0x13C);
|
||||||
|
@ -33,7 +33,7 @@
|
|||||||
|
|
||||||
CColPoint gaTempSphereColPoints[MAX_COLLISION_POINTS];
|
CColPoint gaTempSphereColPoints[MAX_COLLISION_POINTS];
|
||||||
|
|
||||||
CPtrList CWorld::ms_bigBuildingsList[4];
|
CPtrList CWorld::ms_bigBuildingsList[NUM_LEVELS];
|
||||||
CPtrList CWorld::ms_listMovingEntityPtrs;
|
CPtrList CWorld::ms_listMovingEntityPtrs;
|
||||||
CSector CWorld::ms_aSectors[NUMSECTORS_Y][NUMSECTORS_X];
|
CSector CWorld::ms_aSectors[NUMSECTORS_Y][NUMSECTORS_X];
|
||||||
uint16 CWorld::ms_nCurrentScanCode;
|
uint16 CWorld::ms_nCurrentScanCode;
|
||||||
@ -1361,102 +1361,6 @@ CWorld::FindMissionEntitiesIntersectingCubeSectorList(CPtrList &list, const CVec
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CPlayerPed *
|
|
||||||
FindPlayerPed(void)
|
|
||||||
{
|
|
||||||
return CWorld::Players[CWorld::PlayerInFocus].m_pPed;
|
|
||||||
}
|
|
||||||
|
|
||||||
CVehicle *
|
|
||||||
FindPlayerVehicle(void)
|
|
||||||
{
|
|
||||||
CPlayerPed *ped = FindPlayerPed();
|
|
||||||
if(ped && ped->InVehicle()) return ped->m_pMyVehicle;
|
|
||||||
return nil;
|
|
||||||
}
|
|
||||||
|
|
||||||
CVehicle *
|
|
||||||
FindPlayerTrain(void)
|
|
||||||
{
|
|
||||||
if(FindPlayerVehicle() && FindPlayerVehicle()->IsTrain())
|
|
||||||
return FindPlayerVehicle();
|
|
||||||
else
|
|
||||||
return nil;
|
|
||||||
}
|
|
||||||
|
|
||||||
CEntity *
|
|
||||||
FindPlayerEntity(void)
|
|
||||||
{
|
|
||||||
CPlayerPed *ped = FindPlayerPed();
|
|
||||||
if(ped->InVehicle())
|
|
||||||
return ped->m_pMyVehicle;
|
|
||||||
else
|
|
||||||
return ped;
|
|
||||||
}
|
|
||||||
|
|
||||||
CVector
|
|
||||||
FindPlayerCoors(void)
|
|
||||||
{
|
|
||||||
#ifdef FIX_BUGS
|
|
||||||
if (CReplay::IsPlayingBack())
|
|
||||||
return TheCamera.GetPosition();
|
|
||||||
#endif
|
|
||||||
CPlayerPed *ped = FindPlayerPed();
|
|
||||||
if(ped->InVehicle())
|
|
||||||
return ped->m_pMyVehicle->GetPosition();
|
|
||||||
else
|
|
||||||
return ped->GetPosition();
|
|
||||||
}
|
|
||||||
|
|
||||||
CVector &
|
|
||||||
FindPlayerSpeed(void)
|
|
||||||
{
|
|
||||||
#ifdef FIX_BUGS
|
|
||||||
static CVector vecTmpVector(0.0f, 0.0f, 0.0f);
|
|
||||||
if (CReplay::IsPlayingBack())
|
|
||||||
return vecTmpVector;
|
|
||||||
#endif
|
|
||||||
CPlayerPed *ped = FindPlayerPed();
|
|
||||||
if(ped->InVehicle())
|
|
||||||
return ped->m_pMyVehicle->m_vecMoveSpeed;
|
|
||||||
else
|
|
||||||
return ped->m_vecMoveSpeed;
|
|
||||||
}
|
|
||||||
|
|
||||||
const CVector &
|
|
||||||
FindPlayerCentreOfWorld(int32 player)
|
|
||||||
{
|
|
||||||
#ifdef FIX_BUGS
|
|
||||||
if(CReplay::IsPlayingBack()) return TheCamera.GetPosition();
|
|
||||||
#endif
|
|
||||||
if(CCarCtrl::bCarsGeneratedAroundCamera) return TheCamera.GetPosition();
|
|
||||||
if(CWorld::Players[player].m_pRemoteVehicle) return CWorld::Players[player].m_pRemoteVehicle->GetPosition();
|
|
||||||
if(FindPlayerVehicle()) return FindPlayerVehicle()->GetPosition();
|
|
||||||
return CWorld::Players[player].m_pPed->GetPosition();
|
|
||||||
}
|
|
||||||
|
|
||||||
const CVector &
|
|
||||||
FindPlayerCentreOfWorld_NoSniperShift(void)
|
|
||||||
{
|
|
||||||
#ifdef FIX_BUGS
|
|
||||||
if (CReplay::IsPlayingBack()) return TheCamera.GetPosition();
|
|
||||||
#endif
|
|
||||||
if(CCarCtrl::bCarsGeneratedAroundCamera) return TheCamera.GetPosition();
|
|
||||||
if(CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle)
|
|
||||||
return CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle->GetPosition();
|
|
||||||
if(FindPlayerVehicle()) return FindPlayerVehicle()->GetPosition();
|
|
||||||
return FindPlayerPed()->GetPosition();
|
|
||||||
}
|
|
||||||
|
|
||||||
float
|
|
||||||
FindPlayerHeading(void)
|
|
||||||
{
|
|
||||||
if(CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle)
|
|
||||||
return CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle->GetForward().Heading();
|
|
||||||
if(FindPlayerVehicle()) return FindPlayerVehicle()->GetForward().Heading();
|
|
||||||
return FindPlayerPed()->GetForward().Heading();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
CWorld::ClearCarsFromArea(float x1, float y1, float z1, float x2, float y2, float z2)
|
CWorld::ClearCarsFromArea(float x1, float y1, float z1, float x2, float y2, float z2)
|
||||||
{
|
{
|
||||||
@ -1537,7 +1441,7 @@ CWorld::CallOffChaseForAreaSectorListVehicles(CPtrList &list, float x1, float y1
|
|||||||
if(pVehicle->m_scanCode != GetCurrentScanCode()) {
|
if(pVehicle->m_scanCode != GetCurrentScanCode()) {
|
||||||
pVehicle->m_scanCode = GetCurrentScanCode();
|
pVehicle->m_scanCode = GetCurrentScanCode();
|
||||||
const CVector &vehiclePos = pVehicle->GetPosition();
|
const CVector &vehiclePos = pVehicle->GetPosition();
|
||||||
eCarMission carMission = pVehicle->AutoPilot.m_nCarMission;
|
uint8 carMission = pVehicle->AutoPilot.m_nCarMission;
|
||||||
if(pVehicle != FindPlayerVehicle() && vehiclePos.x > fStartX && vehiclePos.x < fEndX &&
|
if(pVehicle != FindPlayerVehicle() && vehiclePos.x > fStartX && vehiclePos.x < fEndX &&
|
||||||
vehiclePos.y > fStartY && vehiclePos.y < fEndY && pVehicle->bIsLawEnforcer &&
|
vehiclePos.y > fStartY && vehiclePos.y < fEndY && pVehicle->bIsLawEnforcer &&
|
||||||
(carMission == MISSION_RAMPLAYER_FARAWAY || carMission == MISSION_RAMPLAYER_CLOSE ||
|
(carMission == MISSION_RAMPLAYER_FARAWAY || carMission == MISSION_RAMPLAYER_CLOSE ||
|
||||||
@ -1745,13 +1649,13 @@ CWorld::ShutDown(void)
|
|||||||
pSector->m_lists[ENTITYLIST_DUMMIES_OVERLAP].Flush();
|
pSector->m_lists[ENTITYLIST_DUMMIES_OVERLAP].Flush();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
for(int32 i = 0; i < 4; i++) {
|
for(int32 i = 0; i < NUM_LEVELS; i++) {
|
||||||
for(CPtrNode *pNode = GetBigBuildingList((eLevelName)i).first; pNode; pNode = pNode->next) {
|
for(CPtrNode *pNode = ms_bigBuildingsList[i].first; pNode; pNode = pNode->next) {
|
||||||
CEntity *pEntity = (CEntity *)pNode->item;
|
CEntity *pEntity = (CEntity *)pNode->item;
|
||||||
// Maybe remove from world here?
|
// Maybe remove from world here?
|
||||||
delete pEntity;
|
delete pEntity;
|
||||||
}
|
}
|
||||||
GetBigBuildingList((eLevelName)i).Flush();
|
ms_bigBuildingsList[i].Flush();
|
||||||
}
|
}
|
||||||
for(int i = 0; i < NUMSECTORS_X * NUMSECTORS_Y; i++) {
|
for(int i = 0; i < NUMSECTORS_X * NUMSECTORS_Y; i++) {
|
||||||
CSector *pSector = GetSector(i % NUMSECTORS_X, i / NUMSECTORS_Y);
|
CSector *pSector = GetSector(i % NUMSECTORS_X, i / NUMSECTORS_Y);
|
||||||
@ -1955,12 +1859,11 @@ CWorld::Process(void)
|
|||||||
} else {
|
} else {
|
||||||
for(CPtrNode *node = ms_listMovingEntityPtrs.first; node; node = node->next) {
|
for(CPtrNode *node = ms_listMovingEntityPtrs.first; node; node = node->next) {
|
||||||
CEntity *movingEnt = (CEntity *)node->item;
|
CEntity *movingEnt = (CEntity *)node->item;
|
||||||
#ifdef SQUEEZE_PERFORMANCE
|
#ifdef FIX_BUGS // from VC
|
||||||
if (movingEnt->bRemoveFromWorld) {
|
if(!movingEnt->bRemoveFromWorld && movingEnt->m_rwObject && RwObjectGetType(movingEnt->m_rwObject) == rpCLUMP &&
|
||||||
RemoveEntityInsteadOfProcessingIt(movingEnt);
|
#else
|
||||||
} else
|
|
||||||
#endif
|
|
||||||
if(movingEnt->m_rwObject && RwObjectGetType(movingEnt->m_rwObject) == rpCLUMP &&
|
if(movingEnt->m_rwObject && RwObjectGetType(movingEnt->m_rwObject) == rpCLUMP &&
|
||||||
|
#endif
|
||||||
RpAnimBlendClumpGetFirstAssociation(movingEnt->GetClump())) {
|
RpAnimBlendClumpGetFirstAssociation(movingEnt->GetClump())) {
|
||||||
RpAnimBlendClumpUpdateAnimations(movingEnt->GetClump(),
|
RpAnimBlendClumpUpdateAnimations(movingEnt->GetClump(),
|
||||||
0.02f * (movingEnt->IsObject()
|
0.02f * (movingEnt->IsObject()
|
||||||
|
@ -55,7 +55,7 @@ struct CStoredCollPoly;
|
|||||||
|
|
||||||
class CWorld
|
class CWorld
|
||||||
{
|
{
|
||||||
static CPtrList ms_bigBuildingsList[4];
|
static CPtrList ms_bigBuildingsList[NUM_LEVELS];
|
||||||
static CPtrList ms_listMovingEntityPtrs;
|
static CPtrList ms_listMovingEntityPtrs;
|
||||||
static CSector ms_aSectors[NUMSECTORS_Y][NUMSECTORS_X];
|
static CSector ms_aSectors[NUMSECTORS_Y][NUMSECTORS_X];
|
||||||
static uint16 ms_nCurrentScanCode;
|
static uint16 ms_nCurrentScanCode;
|
||||||
@ -157,14 +157,3 @@ public:
|
|||||||
|
|
||||||
extern CColPoint gaTempSphereColPoints[MAX_COLLISION_POINTS];
|
extern CColPoint gaTempSphereColPoints[MAX_COLLISION_POINTS];
|
||||||
|
|
||||||
class CPlayerPed;
|
|
||||||
class CVehicle;
|
|
||||||
CPlayerPed *FindPlayerPed(void);
|
|
||||||
CVehicle *FindPlayerVehicle(void);
|
|
||||||
CVehicle *FindPlayerTrain(void);
|
|
||||||
CEntity *FindPlayerEntity(void);
|
|
||||||
CVector FindPlayerCoors(void);
|
|
||||||
CVector &FindPlayerSpeed(void);
|
|
||||||
const CVector &FindPlayerCentreOfWorld(int32 player);
|
|
||||||
const CVector &FindPlayerCentreOfWorld_NoSniperShift(void);
|
|
||||||
float FindPlayerHeading(void);
|
|
||||||
|
@ -274,8 +274,14 @@ void re3_usererror(const char *format, ...);
|
|||||||
|
|
||||||
#define DEBUGBREAK() __debugbreak();
|
#define DEBUGBREAK() __debugbreak();
|
||||||
|
|
||||||
#define debug(f, ...) re3_debug("[DBG]: " f, ## __VA_ARGS__)
|
// Switch to enable development messages.
|
||||||
|
#if 1
|
||||||
|
#define DEV(f, ...)
|
||||||
|
#else
|
||||||
#define DEV(f, ...) re3_debug("[DEV]: " f, ## __VA_ARGS__)
|
#define DEV(f, ...) re3_debug("[DEV]: " f, ## __VA_ARGS__)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define debug(f, ...) re3_debug("[DBG]: " f, ## __VA_ARGS__)
|
||||||
#define TRACE(f, ...) re3_trace(__FILE__, __LINE__, __FUNCTION__, f, ## __VA_ARGS__)
|
#define TRACE(f, ...) re3_trace(__FILE__, __LINE__, __FUNCTION__, f, ## __VA_ARGS__)
|
||||||
#define Error(f, ...) re3_debug("[ERROR]: " f, ## __VA_ARGS__)
|
#define Error(f, ...) re3_debug("[ERROR]: " f, ## __VA_ARGS__)
|
||||||
#define USERERROR(f, ...) re3_usererror(f, ## __VA_ARGS__)
|
#define USERERROR(f, ...) re3_usererror(f, ## __VA_ARGS__)
|
||||||
|
@ -300,7 +300,7 @@ enum Config {
|
|||||||
# define CUSTOM_FRONTEND_OPTIONS
|
# define CUSTOM_FRONTEND_OPTIONS
|
||||||
|
|
||||||
# ifdef CUSTOM_FRONTEND_OPTIONS
|
# ifdef CUSTOM_FRONTEND_OPTIONS
|
||||||
# define GRAPHICS_MENU_OPTIONS // otherwise Advanced Options menu will appear if Display is full
|
# define GRAPHICS_MENU_OPTIONS // otherwise Display settings will be scrollable
|
||||||
# define NO_ISLAND_LOADING // disable loadscreen between islands via loading all island data at once, consumes more memory and CPU
|
# define NO_ISLAND_LOADING // disable loadscreen between islands via loading all island data at once, consumes more memory and CPU
|
||||||
# define CUTSCENE_BORDERS_SWITCH
|
# define CUTSCENE_BORDERS_SWITCH
|
||||||
# define MULTISAMPLING // adds MSAA option
|
# define MULTISAMPLING // adds MSAA option
|
||||||
|
@ -415,6 +415,63 @@ PluginAttach(void)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef GTA_PS2
|
||||||
|
#define NUM_PREALLOC_ATOMICS 3245
|
||||||
|
#define NUM_PREALLOC_CLUMPS 101
|
||||||
|
#define NUM_PREALLOC_FRAMES 2821
|
||||||
|
#define NUM_PREALLOC_GEOMETRIES 1404
|
||||||
|
#define NUM_PREALLOC_TEXDICTS 106
|
||||||
|
#define NUM_PREALLOC_TEXTURES 1900
|
||||||
|
#define NUM_PREALLOC_MATERIALS 3300
|
||||||
|
bool preAlloc;
|
||||||
|
|
||||||
|
void
|
||||||
|
PreAllocateRwObjects(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
void **tmp = new void*[0x8000];
|
||||||
|
preAlloc = true;
|
||||||
|
|
||||||
|
for(i = 0; i < NUM_PREALLOC_ATOMICS; i++)
|
||||||
|
tmp[i] = RpAtomicCreate();
|
||||||
|
for(i = 0; i < NUM_PREALLOC_ATOMICS; i++)
|
||||||
|
RpAtomicDestroy((RpAtomic*)tmp[i]);
|
||||||
|
|
||||||
|
for(i = 0; i < NUM_PREALLOC_CLUMPS; i++)
|
||||||
|
tmp[i] = RpClumpCreate();
|
||||||
|
for(i = 0; i < NUM_PREALLOC_CLUMPS; i++)
|
||||||
|
RpClumpDestroy((RpClump*)tmp[i]);
|
||||||
|
|
||||||
|
for(i = 0; i < NUM_PREALLOC_FRAMES; i++)
|
||||||
|
tmp[i] = RwFrameCreate();
|
||||||
|
for(i = 0; i < NUM_PREALLOC_FRAMES; i++)
|
||||||
|
RwFrameDestroy((RwFrame*)tmp[i]);
|
||||||
|
|
||||||
|
for(i = 0; i < NUM_PREALLOC_GEOMETRIES; i++)
|
||||||
|
tmp[i] = RpGeometryCreate(0, 0, 0);
|
||||||
|
for(i = 0; i < NUM_PREALLOC_GEOMETRIES; i++)
|
||||||
|
RpGeometryDestroy((RpGeometry*)tmp[i]);
|
||||||
|
|
||||||
|
for(i = 0; i < NUM_PREALLOC_TEXDICTS; i++)
|
||||||
|
tmp[i] = RwTexDictionaryCreate();
|
||||||
|
for(i = 0; i < NUM_PREALLOC_TEXDICTS; i++)
|
||||||
|
RwTexDictionaryDestroy((RwTexDictionary*)tmp[i]);
|
||||||
|
|
||||||
|
for(i = 0; i < NUM_PREALLOC_TEXTURES; i++)
|
||||||
|
tmp[i] = RwTextureCreate(RwRasterCreate(0, 0, 0, 0));
|
||||||
|
for(i = 0; i < NUM_PREALLOC_TEXDICTS; i++)
|
||||||
|
RwTextureDestroy((RwTexture*)tmp[i]);
|
||||||
|
|
||||||
|
for(i = 0; i < NUM_PREALLOC_MATERIALS; i++)
|
||||||
|
tmp[i] = RpMaterialCreate();
|
||||||
|
for(i = 0; i < NUM_PREALLOC_MATERIALS; i++)
|
||||||
|
RpMaterialDestroy((RpMaterial*)tmp[i]);
|
||||||
|
|
||||||
|
delete[] tmp;
|
||||||
|
preAlloc = false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static RwBool
|
static RwBool
|
||||||
Initialise3D(void *param)
|
Initialise3D(void *param)
|
||||||
{
|
{
|
||||||
@ -621,8 +678,10 @@ LoadingScreen(const char *str1, const char *str2, const char *splashscreen)
|
|||||||
AsciiToUnicode(str1, tmpstr);
|
AsciiToUnicode(str1, tmpstr);
|
||||||
CFont::PrintString(hpos, vpos, tmpstr);
|
CFont::PrintString(hpos, vpos, tmpstr);
|
||||||
vpos += 22*yscale;
|
vpos += 22*yscale;
|
||||||
|
if (str2) {
|
||||||
AsciiToUnicode(str2, tmpstr);
|
AsciiToUnicode(str2, tmpstr);
|
||||||
CFont::PrintString(hpos, vpos, tmpstr);
|
CFont::PrintString(hpos, vpos, tmpstr);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1581,15 +1640,6 @@ AppEventHandler(RsEvent event, void *param)
|
|||||||
return rsEVENTPROCESSED;
|
return rsEVENTPROCESSED;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef MASTER
|
|
||||||
case rsANIMVIEWER:
|
|
||||||
{
|
|
||||||
TheModelViewer();
|
|
||||||
|
|
||||||
return rsEVENTPROCESSED;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
return rsEVENTNOTPROCESSED;
|
return rsEVENTNOTPROCESSED;
|
||||||
@ -1604,8 +1654,11 @@ TheModelViewer(void)
|
|||||||
#if (defined(GTA_PS2) || defined(GTA_XBOX))
|
#if (defined(GTA_PS2) || defined(GTA_XBOX))
|
||||||
//TODO
|
//TODO
|
||||||
#else
|
#else
|
||||||
|
// This is III Mobile code. III Xbox code run it like main function, which is impossible to implement on PC's state machine implementation.
|
||||||
|
// Also we want 2D things initialized in here to print animation ids etc., our additions for that marked with X
|
||||||
|
|
||||||
#ifdef ASPECT_RATIO_SCALE
|
#ifdef ASPECT_RATIO_SCALE
|
||||||
CDraw::SetAspectRatio(CDraw::FindAspectRatio());
|
CDraw::SetAspectRatio(CDraw::FindAspectRatio()); // X
|
||||||
#endif
|
#endif
|
||||||
CAnimViewer::Update();
|
CAnimViewer::Update();
|
||||||
CTimer::Update();
|
CTimer::Update();
|
||||||
@ -1615,12 +1668,12 @@ TheModelViewer(void)
|
|||||||
CTimeCycle::GetSkyBottomRed(), CTimeCycle::GetSkyBottomGreen(), CTimeCycle::GetSkyBottomBlue(),
|
CTimeCycle::GetSkyBottomRed(), CTimeCycle::GetSkyBottomGreen(), CTimeCycle::GetSkyBottomBlue(),
|
||||||
255);
|
255);
|
||||||
|
|
||||||
CSprite2d::InitPerFrame();
|
CSprite2d::InitPerFrame(); // X
|
||||||
CFont::InitPerFrame();
|
CFont::InitPerFrame(); // X
|
||||||
DefinedState();
|
DefinedState();
|
||||||
CVisibilityPlugins::InitAlphaEntityList();
|
CVisibilityPlugins::InitAlphaEntityList();
|
||||||
CAnimViewer::Render();
|
CAnimViewer::Render();
|
||||||
Render2dStuff();
|
Render2dStuff(); // X
|
||||||
DoRWStuffEndOfFrame();
|
DoRWStuffEndOfFrame();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -29,6 +29,7 @@ class CSprite2d;
|
|||||||
bool DoRWStuffStartOfFrame(int16 TopRed, int16 TopGreen, int16 TopBlue, int16 BottomRed, int16 BottomGreen, int16 BottomBlue, int16 Alpha);
|
bool DoRWStuffStartOfFrame(int16 TopRed, int16 TopGreen, int16 TopBlue, int16 BottomRed, int16 BottomGreen, int16 BottomBlue, int16 Alpha);
|
||||||
bool DoRWStuffStartOfFrame_Horizon(int16 TopRed, int16 TopGreen, int16 TopBlue, int16 BottomRed, int16 BottomGreen, int16 BottomBlue, int16 Alpha);
|
bool DoRWStuffStartOfFrame_Horizon(int16 TopRed, int16 TopGreen, int16 TopBlue, int16 BottomRed, int16 BottomGreen, int16 BottomBlue, int16 Alpha);
|
||||||
void DoRWStuffEndOfFrame(void);
|
void DoRWStuffEndOfFrame(void);
|
||||||
|
void PreAllocateRwObjects(void);
|
||||||
void InitialiseGame(void);
|
void InitialiseGame(void);
|
||||||
void LoadingScreen(const char *str1, const char *str2, const char *splashscreen);
|
void LoadingScreen(const char *str1, const char *str2, const char *splashscreen);
|
||||||
void LoadingIslandScreen(const char *levelName);
|
void LoadingIslandScreen(const char *levelName);
|
||||||
|
@ -1,31 +1,31 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
template<typename T, int n>
|
template<typename T, int32 n>
|
||||||
class CStore
|
class CStore
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
int allocPtr;
|
int32 allocPtr;
|
||||||
T store[n];
|
T store[n];
|
||||||
|
|
||||||
T *alloc(void){
|
T *Alloc(void){
|
||||||
if(this->allocPtr >= n){
|
if(allocPtr >= n){
|
||||||
printf("Size of this thing:%d needs increasing\n", n);
|
printf("Size of this thing:%d needs increasing\n", n);
|
||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
return &this->store[this->allocPtr++];
|
return &store[allocPtr++];
|
||||||
}
|
}
|
||||||
void clear(void){
|
void Clear(void){
|
||||||
this->allocPtr = 0;
|
allocPtr = 0;
|
||||||
}
|
}
|
||||||
int getIndex(T *item){
|
int32 GetIndex(T *item){
|
||||||
assert(item >= &this->store[0]);
|
assert(item >= &store[0]);
|
||||||
assert(item < &this->store[n]);
|
assert(item < &store[n]);
|
||||||
return item - this->store;
|
return item - store;
|
||||||
}
|
}
|
||||||
T *getItem(int index){
|
T *GetItem(int32 index){
|
||||||
assert(index >= 0);
|
assert(index >= 0);
|
||||||
assert(index < n);
|
assert(index < n);
|
||||||
return &this->store[index];
|
return &store[index];
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -40,12 +40,11 @@ class CPool
|
|||||||
};
|
};
|
||||||
uint8 u;
|
uint8 u;
|
||||||
} *m_flags;
|
} *m_flags;
|
||||||
int m_size;
|
int32 m_size;
|
||||||
int m_allocPtr;
|
int32 m_allocPtr;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CPool(int size){
|
CPool(int32 size){
|
||||||
// TODO: use new here
|
|
||||||
m_entries = (U*)new uint8[sizeof(U)*size];
|
m_entries = (U*)new uint8[sizeof(U)*size];
|
||||||
m_flags = (Flags*)new uint8[sizeof(Flags)*size];
|
m_flags = (Flags*)new uint8[sizeof(Flags)*size];
|
||||||
m_size = size;
|
m_size = size;
|
||||||
@ -69,7 +68,7 @@ public:
|
|||||||
m_allocPtr = 0;
|
m_allocPtr = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
int GetSize(void) const { return m_size; }
|
int32 GetSize(void) const { return m_size; }
|
||||||
T *New(void){
|
T *New(void){
|
||||||
bool wrapped = false;
|
bool wrapped = false;
|
||||||
do
|
do
|
||||||
@ -93,12 +92,12 @@ public:
|
|||||||
m_flags[m_allocPtr].id++;
|
m_flags[m_allocPtr].id++;
|
||||||
return (T*)&m_entries[m_allocPtr];
|
return (T*)&m_entries[m_allocPtr];
|
||||||
}
|
}
|
||||||
T *New(int handle){
|
T *New(int32 handle){
|
||||||
T *entry = (T*)&m_entries[handle>>8];
|
T *entry = (T*)&m_entries[handle>>8];
|
||||||
SetNotFreeAt(handle);
|
SetNotFreeAt(handle);
|
||||||
return entry;
|
return entry;
|
||||||
}
|
}
|
||||||
void SetNotFreeAt(int handle){
|
void SetNotFreeAt(int32 handle){
|
||||||
int idx = handle>>8;
|
int idx = handle>>8;
|
||||||
m_flags[idx].free = 0;
|
m_flags[idx].free = 0;
|
||||||
m_flags[idx].id = handle & 0x7F;
|
m_flags[idx].id = handle & 0x7F;
|
||||||
@ -123,21 +122,21 @@ public:
|
|||||||
return m_flags[handle>>8].u == (handle & 0xFF) ?
|
return m_flags[handle>>8].u == (handle & 0xFF) ?
|
||||||
(T*)&m_entries[handle >> 8] : nil;
|
(T*)&m_entries[handle >> 8] : nil;
|
||||||
}
|
}
|
||||||
int GetIndex(T *entry){
|
int32 GetIndex(T *entry){
|
||||||
int i = GetJustIndex_NoFreeAssert(entry);
|
int i = GetJustIndex_NoFreeAssert(entry);
|
||||||
return m_flags[i].u + (i<<8);
|
return m_flags[i].u + (i<<8);
|
||||||
}
|
}
|
||||||
int GetJustIndex(T *entry){
|
int32 GetJustIndex(T *entry){
|
||||||
int index = GetJustIndex_NoFreeAssert(entry);
|
int index = GetJustIndex_NoFreeAssert(entry);
|
||||||
assert(!IsFreeSlot(index));
|
assert(!IsFreeSlot(index));
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
int GetJustIndex_NoFreeAssert(T* entry){
|
int32 GetJustIndex_NoFreeAssert(T* entry){
|
||||||
int index = ((U*)entry - m_entries);
|
int index = ((U*)entry - m_entries);
|
||||||
assert((U*)entry == (U*)&m_entries[index]); // cast is unsafe - check required
|
assert((U*)entry == (U*)&m_entries[index]); // cast is unsafe - check required
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
int GetNoOfUsedSpaces(void) const{
|
int32 GetNoOfUsedSpaces(void) const{
|
||||||
int i;
|
int i;
|
||||||
int n = 0;
|
int n = 0;
|
||||||
for(i = 0; i < m_size; i++)
|
for(i = 0; i < m_size; i++)
|
||||||
@ -241,7 +240,7 @@ public:
|
|||||||
link->Remove(); // remove from list
|
link->Remove(); // remove from list
|
||||||
freeHead.Insert(link); // insert into free list
|
freeHead.Insert(link); // insert into free list
|
||||||
}
|
}
|
||||||
int Count(void){
|
int32 Count(void){
|
||||||
int n = 0;
|
int n = 0;
|
||||||
CLink<T> *lnk;
|
CLink<T> *lnk;
|
||||||
for(lnk = head.next; lnk != &tail; lnk = lnk->next)
|
for(lnk = head.next; lnk != &tail; lnk = lnk->next)
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
struct CReference;
|
struct CReference;
|
||||||
class CPtrList;
|
class CPtrList;
|
||||||
|
|
||||||
enum eEntityType : uint8
|
enum eEntityType
|
||||||
{
|
{
|
||||||
ENTITY_TYPE_NOTHING = 0,
|
ENTITY_TYPE_NOTHING = 0,
|
||||||
ENTITY_TYPE_BUILDING,
|
ENTITY_TYPE_BUILDING,
|
||||||
@ -16,7 +16,7 @@ enum eEntityType : uint8
|
|||||||
ENTITY_TYPE_DUMMY,
|
ENTITY_TYPE_DUMMY,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum eEntityStatus : uint8
|
enum eEntityStatus
|
||||||
{
|
{
|
||||||
STATUS_PLAYER,
|
STATUS_PLAYER,
|
||||||
STATUS_PLAYER_PLAYBACKFROMBUFFER,
|
STATUS_PLAYER_PLAYBACKFROMBUFFER,
|
||||||
@ -92,10 +92,10 @@ public:
|
|||||||
CReference *m_pFirstReference;
|
CReference *m_pFirstReference;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
eEntityType GetType() const { return (eEntityType)m_type; }
|
uint8 GetType() const { return m_type; }
|
||||||
void SetType(eEntityType type) { m_type = type; }
|
void SetType(uint8 type) { m_type = type; }
|
||||||
eEntityStatus GetStatus() const { return (eEntityStatus)m_status; }
|
uint8 GetStatus() const { return m_status; }
|
||||||
void SetStatus(eEntityStatus status) { m_status = status; }
|
void SetStatus(uint8 status) { m_status = status; }
|
||||||
CColModel *GetColModel(void) { return CModelInfo::GetModelInfo(m_modelIndex)->GetColModel(); }
|
CColModel *GetColModel(void) { return CModelInfo::GetModelInfo(m_modelIndex)->GetColModel(); }
|
||||||
bool GetIsStatic(void) const { return bIsStatic; }
|
bool GetIsStatic(void) const { return bIsStatic; }
|
||||||
void SetIsStatic(bool state) { bIsStatic = state; }
|
void SetIsStatic(bool state) { bIsStatic = state; }
|
||||||
|
@ -384,9 +384,9 @@ ScreenDroplets::ProcessCameraMovement(void)
|
|||||||
ms_prevCamUp = camUp;
|
ms_prevCamUp = camUp;
|
||||||
ms_prevCamPos = camPos;
|
ms_prevCamPos = camPos;
|
||||||
|
|
||||||
ms_screenMoveDelta.x = -RwV3dDotProduct(&camMat->right, (RwV3d*)&ms_camMoveDelta);
|
ms_screenMoveDelta.x = -RwV3dDotProduct(&camMat->right, &ms_camMoveDelta);
|
||||||
ms_screenMoveDelta.y = RwV3dDotProduct(&camMat->up, (RwV3d*)&ms_camMoveDelta);
|
ms_screenMoveDelta.y = RwV3dDotProduct(&camMat->up, &ms_camMoveDelta);
|
||||||
ms_screenMoveDelta.z = RwV3dDotProduct(&camMat->at, (RwV3d*)&ms_camMoveDelta);
|
ms_screenMoveDelta.z = RwV3dDotProduct(&camMat->at, &ms_camMoveDelta);
|
||||||
ms_screenMoveDelta *= 10.0f;
|
ms_screenMoveDelta *= 10.0f;
|
||||||
ms_screenMoveDist = ms_screenMoveDelta.Magnitude2D();
|
ms_screenMoveDist = ms_screenMoveDelta.Magnitude2D();
|
||||||
|
|
||||||
|
@ -12,6 +12,11 @@ public:
|
|||||||
float MagnitudeSqr(void) const { return x*x + y*y + z*z + w*w; }
|
float MagnitudeSqr(void) const { return x*x + y*y + z*z + w*w; }
|
||||||
void Normalise(void);
|
void Normalise(void);
|
||||||
void Multiply(const CQuaternion &q1, const CQuaternion &q2);
|
void Multiply(const CQuaternion &q1, const CQuaternion &q2);
|
||||||
|
void Invert(void){ // Conjugate would have been a better name
|
||||||
|
x = -x;
|
||||||
|
y = -y;
|
||||||
|
z = -z;
|
||||||
|
}
|
||||||
|
|
||||||
const CQuaternion &operator+=(CQuaternion const &right) {
|
const CQuaternion &operator+=(CQuaternion const &right) {
|
||||||
x += right.x;
|
x += right.x;
|
||||||
|
@ -1,23 +1,22 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
class CVector
|
class CVector : public RwV3d
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
float x, y, z;
|
|
||||||
CVector(void) {}
|
CVector(void) {}
|
||||||
CVector(float x, float y, float z) : x(x), y(y), z(z) {}
|
CVector(float x, float y, float z)
|
||||||
#ifdef RWCORE_H
|
{
|
||||||
CVector(const RwV3d &v) : x(v.x), y(v.y), z(v.z) {}
|
this->x = x;
|
||||||
|
this->y = y;
|
||||||
operator RwV3d (void) const {
|
this->z = z;
|
||||||
RwV3d vecRw = { this->x, this->y, this->z };
|
|
||||||
return vecRw;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
operator RwV3d *(void) {
|
CVector(const RwV3d &v)
|
||||||
return (RwV3d*)this;
|
{
|
||||||
|
x = v.x;
|
||||||
|
y = v.y;
|
||||||
|
z = v.z;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
// (0,1,0) means no rotation. So get right vector and its atan
|
// (0,1,0) means no rotation. So get right vector and its atan
|
||||||
float Heading(void) const { return Atan2(-x, y); }
|
float Heading(void) const { return Atan2(-x, y); }
|
||||||
float Magnitude(void) const { return Sqrt(x*x + y*y + z*z); }
|
float Magnitude(void) const { return Sqrt(x*x + y*y + z*z); }
|
||||||
|
@ -8,18 +8,7 @@ public:
|
|||||||
CVuVector(float x, float y, float z) : CVector(x, y, z) {}
|
CVuVector(float x, float y, float z) : CVector(x, y, z) {}
|
||||||
CVuVector(float x, float y, float z, float w) : CVector(x, y, z), w(w) {}
|
CVuVector(float x, float y, float z, float w) : CVector(x, y, z), w(w) {}
|
||||||
CVuVector(const CVector &v) : CVector(v.x, v.y, v.z) {}
|
CVuVector(const CVector &v) : CVector(v.x, v.y, v.z) {}
|
||||||
#ifdef RWCORE_H
|
CVuVector(const RwV3d &v) : CVector(v) {}
|
||||||
CVuVector(const RwV3d &v) : CVector(v.x, v.y, v.z) {}
|
|
||||||
|
|
||||||
operator RwV3d (void) const {
|
|
||||||
RwV3d vecRw = { this->x, this->y, this->z };
|
|
||||||
return vecRw;
|
|
||||||
}
|
|
||||||
|
|
||||||
operator RwV3d *(void) {
|
|
||||||
return (RwV3d*)this;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
/*
|
/*
|
||||||
void Normalise(void) {
|
void Normalise(void) {
|
||||||
float sq = MagnitudeSqr();
|
float sq = MagnitudeSqr();
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
#define MAX_MODEL_NAME (24)
|
#define MAX_MODEL_NAME (24)
|
||||||
|
|
||||||
enum ModelInfoType : uint8
|
enum ModelInfoType
|
||||||
{
|
{
|
||||||
MITYPE_NA = 0,
|
MITYPE_NA = 0,
|
||||||
MITYPE_SIMPLE = 1,
|
MITYPE_SIMPLE = 1,
|
||||||
@ -15,7 +15,6 @@ enum ModelInfoType : uint8
|
|||||||
MITYPE_PED = 6,
|
MITYPE_PED = 6,
|
||||||
MITYPE_XTRACOMPS = 7,
|
MITYPE_XTRACOMPS = 7,
|
||||||
};
|
};
|
||||||
VALIDATE_SIZE(ModelInfoType, 1);
|
|
||||||
|
|
||||||
class C2dEffect;
|
class C2dEffect;
|
||||||
|
|
||||||
@ -28,7 +27,7 @@ protected:
|
|||||||
int16 m_objectId;
|
int16 m_objectId;
|
||||||
uint16 m_refCount;
|
uint16 m_refCount;
|
||||||
int16 m_txdSlot;
|
int16 m_txdSlot;
|
||||||
ModelInfoType m_type;
|
uint8 m_type;
|
||||||
uint8 m_num2dEffects;
|
uint8 m_num2dEffects;
|
||||||
bool m_bOwnsColModel;
|
bool m_bOwnsColModel;
|
||||||
#ifdef EXTRA_MODEL_FLAGS
|
#ifdef EXTRA_MODEL_FLAGS
|
||||||
@ -50,7 +49,7 @@ public:
|
|||||||
virtual RwObject *GetRwObject(void) = 0;
|
virtual RwObject *GetRwObject(void) = 0;
|
||||||
|
|
||||||
// one day it becomes virtual
|
// one day it becomes virtual
|
||||||
ModelInfoType GetModelType() const { return m_type; }
|
uint8 GetModelType() const { return m_type; }
|
||||||
bool IsSimple(void) { return m_type == MITYPE_SIMPLE || m_type == MITYPE_TIME; }
|
bool IsSimple(void) { return m_type == MITYPE_SIMPLE || m_type == MITYPE_TIME; }
|
||||||
bool IsClump(void) { return m_type == MITYPE_CLUMP || m_type == MITYPE_PED || m_type == MITYPE_VEHICLE ||
|
bool IsClump(void) { return m_type == MITYPE_CLUMP || m_type == MITYPE_PED || m_type == MITYPE_VEHICLE ||
|
||||||
m_type == MITYPE_MLO || m_type == MITYPE_XTRACOMPS; // unused but what the heck
|
m_type == MITYPE_MLO || m_type == MITYPE_XTRACOMPS; // unused but what the heck
|
||||||
|
@ -26,15 +26,15 @@ CModelInfo::Initialise(void)
|
|||||||
|
|
||||||
for(i = 0; i < MODELINFOSIZE; i++)
|
for(i = 0; i < MODELINFOSIZE; i++)
|
||||||
ms_modelInfoPtrs[i] = nil;
|
ms_modelInfoPtrs[i] = nil;
|
||||||
ms_2dEffectStore.clear();
|
ms_2dEffectStore.Clear();
|
||||||
ms_mloInstanceStore.clear();
|
ms_mloInstanceStore.Clear();
|
||||||
ms_xtraCompsModelStore.clear();
|
ms_xtraCompsModelStore.Clear();
|
||||||
ms_simpleModelStore.clear();
|
ms_simpleModelStore.Clear();
|
||||||
ms_timeModelStore.clear();
|
ms_timeModelStore.Clear();
|
||||||
ms_mloModelStore.clear();
|
ms_mloModelStore.Clear();
|
||||||
ms_clumpModelStore.clear();
|
ms_clumpModelStore.Clear();
|
||||||
ms_pedModelStore.clear();
|
ms_pedModelStore.Clear();
|
||||||
ms_vehicleModelStore.clear();
|
ms_vehicleModelStore.Clear();
|
||||||
|
|
||||||
m = AddSimpleModel(MI_CAR_DOOR);
|
m = AddSimpleModel(MI_CAR_DOOR);
|
||||||
m->SetColModel(&CTempColModels::ms_colModelDoor1);
|
m->SetColModel(&CTempColModels::ms_colModelDoor1);
|
||||||
@ -108,22 +108,22 @@ CModelInfo::ShutDown(void)
|
|||||||
for(i = 0; i < ms_2dEffectStore.allocPtr; i++)
|
for(i = 0; i < ms_2dEffectStore.allocPtr; i++)
|
||||||
ms_2dEffectStore.store[i].Shutdown();
|
ms_2dEffectStore.store[i].Shutdown();
|
||||||
|
|
||||||
ms_2dEffectStore.clear();
|
ms_2dEffectStore.Clear();
|
||||||
ms_simpleModelStore.clear();
|
ms_simpleModelStore.Clear();
|
||||||
ms_mloInstanceStore.clear();
|
ms_mloInstanceStore.Clear();
|
||||||
ms_mloModelStore.clear();
|
ms_mloModelStore.Clear();
|
||||||
ms_xtraCompsModelStore.clear();
|
ms_xtraCompsModelStore.Clear();
|
||||||
ms_timeModelStore.clear();
|
ms_timeModelStore.Clear();
|
||||||
ms_pedModelStore.clear();
|
ms_pedModelStore.Clear();
|
||||||
ms_clumpModelStore.clear();
|
ms_clumpModelStore.Clear();
|
||||||
ms_vehicleModelStore.clear();
|
ms_vehicleModelStore.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
CSimpleModelInfo*
|
CSimpleModelInfo*
|
||||||
CModelInfo::AddSimpleModel(int id)
|
CModelInfo::AddSimpleModel(int id)
|
||||||
{
|
{
|
||||||
CSimpleModelInfo *modelinfo;
|
CSimpleModelInfo *modelinfo;
|
||||||
modelinfo = CModelInfo::ms_simpleModelStore.alloc();
|
modelinfo = CModelInfo::ms_simpleModelStore.Alloc();
|
||||||
CModelInfo::ms_modelInfoPtrs[id] = modelinfo;
|
CModelInfo::ms_modelInfoPtrs[id] = modelinfo;
|
||||||
modelinfo->Init();
|
modelinfo->Init();
|
||||||
return modelinfo;
|
return modelinfo;
|
||||||
@ -133,7 +133,7 @@ CMloModelInfo *
|
|||||||
CModelInfo::AddMloModel(int id)
|
CModelInfo::AddMloModel(int id)
|
||||||
{
|
{
|
||||||
CMloModelInfo *modelinfo;
|
CMloModelInfo *modelinfo;
|
||||||
modelinfo = CModelInfo::ms_mloModelStore.alloc();
|
modelinfo = CModelInfo::ms_mloModelStore.Alloc();
|
||||||
CModelInfo::ms_modelInfoPtrs[id] = modelinfo;
|
CModelInfo::ms_modelInfoPtrs[id] = modelinfo;
|
||||||
modelinfo->m_clump = nil;
|
modelinfo->m_clump = nil;
|
||||||
modelinfo->firstInstance = 0;
|
modelinfo->firstInstance = 0;
|
||||||
@ -145,7 +145,7 @@ CTimeModelInfo*
|
|||||||
CModelInfo::AddTimeModel(int id)
|
CModelInfo::AddTimeModel(int id)
|
||||||
{
|
{
|
||||||
CTimeModelInfo *modelinfo;
|
CTimeModelInfo *modelinfo;
|
||||||
modelinfo = CModelInfo::ms_timeModelStore.alloc();
|
modelinfo = CModelInfo::ms_timeModelStore.Alloc();
|
||||||
CModelInfo::ms_modelInfoPtrs[id] = modelinfo;
|
CModelInfo::ms_modelInfoPtrs[id] = modelinfo;
|
||||||
modelinfo->Init();
|
modelinfo->Init();
|
||||||
return modelinfo;
|
return modelinfo;
|
||||||
@ -155,7 +155,7 @@ CClumpModelInfo*
|
|||||||
CModelInfo::AddClumpModel(int id)
|
CModelInfo::AddClumpModel(int id)
|
||||||
{
|
{
|
||||||
CClumpModelInfo *modelinfo;
|
CClumpModelInfo *modelinfo;
|
||||||
modelinfo = CModelInfo::ms_clumpModelStore.alloc();
|
modelinfo = CModelInfo::ms_clumpModelStore.Alloc();
|
||||||
CModelInfo::ms_modelInfoPtrs[id] = modelinfo;
|
CModelInfo::ms_modelInfoPtrs[id] = modelinfo;
|
||||||
modelinfo->m_clump = nil;
|
modelinfo->m_clump = nil;
|
||||||
return modelinfo;
|
return modelinfo;
|
||||||
@ -165,7 +165,7 @@ CPedModelInfo*
|
|||||||
CModelInfo::AddPedModel(int id)
|
CModelInfo::AddPedModel(int id)
|
||||||
{
|
{
|
||||||
CPedModelInfo *modelinfo;
|
CPedModelInfo *modelinfo;
|
||||||
modelinfo = CModelInfo::ms_pedModelStore.alloc();
|
modelinfo = CModelInfo::ms_pedModelStore.Alloc();
|
||||||
CModelInfo::ms_modelInfoPtrs[id] = modelinfo;
|
CModelInfo::ms_modelInfoPtrs[id] = modelinfo;
|
||||||
modelinfo->m_clump = nil;
|
modelinfo->m_clump = nil;
|
||||||
return modelinfo;
|
return modelinfo;
|
||||||
@ -175,7 +175,7 @@ CVehicleModelInfo*
|
|||||||
CModelInfo::AddVehicleModel(int id)
|
CModelInfo::AddVehicleModel(int id)
|
||||||
{
|
{
|
||||||
CVehicleModelInfo *modelinfo;
|
CVehicleModelInfo *modelinfo;
|
||||||
modelinfo = CModelInfo::ms_vehicleModelStore.alloc();
|
modelinfo = CModelInfo::ms_vehicleModelStore.Alloc();
|
||||||
CModelInfo::ms_modelInfoPtrs[id] = modelinfo;
|
CModelInfo::ms_modelInfoPtrs[id] = modelinfo;
|
||||||
modelinfo->m_clump = nil;
|
modelinfo->m_clump = nil;
|
||||||
modelinfo->m_vehicleType = -1;
|
modelinfo->m_vehicleType = -1;
|
||||||
@ -245,7 +245,7 @@ CModelInfo::ConstructMloClumps()
|
|||||||
void
|
void
|
||||||
CModelInfo::ReInit2dEffects()
|
CModelInfo::ReInit2dEffects()
|
||||||
{
|
{
|
||||||
ms_2dEffectStore.clear();
|
ms_2dEffectStore.Clear();
|
||||||
|
|
||||||
for (int i = 0; i < MODELINFOSIZE; i++) {
|
for (int i = 0; i < MODELINFOSIZE; i++) {
|
||||||
if (ms_modelInfoPtrs[i])
|
if (ms_modelInfoPtrs[i])
|
||||||
|
@ -471,7 +471,7 @@ CVehicleModelInfo::PreprocessHierarchy(void)
|
|||||||
|
|
||||||
if(desc[i].flags & VEHICLE_FLAG_POS){
|
if(desc[i].flags & VEHICLE_FLAG_POS){
|
||||||
f = assoc.frame;
|
f = assoc.frame;
|
||||||
rwvec = (RwV3d*)&m_positions[desc[i].hierId];
|
rwvec = &m_positions[desc[i].hierId];
|
||||||
*rwvec = *RwMatrixGetPos(RwFrameGetMatrix(f));
|
*rwvec = *RwMatrixGetPos(RwFrameGetMatrix(f));
|
||||||
for(f = RwFrameGetParent(f); f; f = RwFrameGetParent(f))
|
for(f = RwFrameGetParent(f); f; f = RwFrameGetParent(f))
|
||||||
RwV3dTransformPoints(rwvec, rwvec, 1, RwFrameGetMatrix(f));
|
RwV3dTransformPoints(rwvec, rwvec, 1, RwFrameGetMatrix(f));
|
||||||
|
@ -209,15 +209,15 @@ CObject::ObjectDamage(float amount)
|
|||||||
SetTurnSpeed(0.0f, 0.0f, 0.0f);
|
SetTurnSpeed(0.0f, 0.0f, 0.0f);
|
||||||
const RwRGBA color = { 96, 48, 0, 255 };
|
const RwRGBA color = { 96, 48, 0, 255 };
|
||||||
for (int32 i = 0; i < 25; i++) {
|
for (int32 i = 0; i < 25; i++) {
|
||||||
CVector vecDir(CGeneral::GetRandomNumberInRange(-0.35f, 0.7f),
|
CVector vecDir(CGeneral::GetRandomNumberInRange(-0.35f, 0.35f),
|
||||||
CGeneral::GetRandomNumberInRange(-0.35f, 0.7f),
|
CGeneral::GetRandomNumberInRange(-0.35f, 0.35f),
|
||||||
CGeneral::GetRandomNumberInRange(0.1f, 0.15f) + fDirectionZ);
|
CGeneral::GetRandomNumberInRange(0.1f, 0.25f) + fDirectionZ);
|
||||||
++nFrameGen;
|
++nFrameGen;
|
||||||
int32 currentFrame = nFrameGen & 3;
|
int32 currentFrame = nFrameGen & 3;
|
||||||
float fRandom = CGeneral::GetRandomNumberInRange(0.01f, 1.0f);
|
float fRandom = CGeneral::GetRandomNumberInRange(0.01f, 1.0f);
|
||||||
RwRGBA randomColor = { uint8(color.red * fRandom), uint8(color.green * fRandom) , color.blue, color.alpha };
|
RwRGBA randomColor = { uint8(color.red * fRandom), uint8(color.green * fRandom) , color.blue, color.alpha };
|
||||||
float fSize = CGeneral::GetRandomNumberInRange(0.02f, 0.18f);
|
float fSize = CGeneral::GetRandomNumberInRange(0.02f, 0.20f);
|
||||||
int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-40, 80);
|
int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-40, 40);
|
||||||
CParticle::AddParticle(PARTICLE_CAR_DEBRIS, vecPos, vecDir, nil, fSize, randomColor, nRotationSpeed, 0, currentFrame, 0);
|
CParticle::AddParticle(PARTICLE_CAR_DEBRIS, vecPos, vecDir, nil, fSize, randomColor, nRotationSpeed, 0, currentFrame, 0);
|
||||||
}
|
}
|
||||||
PlayOneShotScriptObject(SCRIPT_SOUND_BOX_DESTROYED_2, vecPos);
|
PlayOneShotScriptObject(SCRIPT_SOUND_BOX_DESTROYED_2, vecPos);
|
||||||
@ -232,15 +232,15 @@ CObject::ObjectDamage(float amount)
|
|||||||
SetTurnSpeed(0.0f, 0.0f, 0.0f);
|
SetTurnSpeed(0.0f, 0.0f, 0.0f);
|
||||||
const RwRGBA color = { 128, 128, 128, 255 };
|
const RwRGBA color = { 128, 128, 128, 255 };
|
||||||
for (int32 i = 0; i < 45; i++) {
|
for (int32 i = 0; i < 45; i++) {
|
||||||
CVector vecDir(CGeneral::GetRandomNumberInRange(-0.35f, 0.7f),
|
CVector vecDir(CGeneral::GetRandomNumberInRange(-0.35f, 0.35f),
|
||||||
CGeneral::GetRandomNumberInRange(-0.35f, 0.7f),
|
CGeneral::GetRandomNumberInRange(-0.35f, 0.35f),
|
||||||
CGeneral::GetRandomNumberInRange(0.1f, 0.15f) + fDirectionZ);
|
CGeneral::GetRandomNumberInRange(0.1f, 0.25f) + fDirectionZ);
|
||||||
++nFrameGen;
|
++nFrameGen;
|
||||||
int32 currentFrame = nFrameGen & 3;
|
int32 currentFrame = nFrameGen & 3;
|
||||||
float fRandom = CGeneral::GetRandomNumberInRange(0.5f, 0.5f);
|
float fRandom = CGeneral::GetRandomNumberInRange(0.5f, 1.0f);
|
||||||
RwRGBA randomColor = { uint8(color.red * fRandom), uint8(color.green * fRandom), uint8(color.blue * fRandom), color.alpha };
|
RwRGBA randomColor = { uint8(color.red * fRandom), uint8(color.green * fRandom), uint8(color.blue * fRandom), color.alpha };
|
||||||
float fSize = CGeneral::GetRandomNumberInRange(0.02f, 0.18f);
|
float fSize = CGeneral::GetRandomNumberInRange(0.02f, 0.20f);
|
||||||
int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-40, 80);
|
int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-40, 40);
|
||||||
CParticle::AddParticle(PARTICLE_CAR_DEBRIS, vecPos, vecDir, nil, fSize, randomColor, nRotationSpeed, 0, currentFrame, 0);
|
CParticle::AddParticle(PARTICLE_CAR_DEBRIS, vecPos, vecDir, nil, fSize, randomColor, nRotationSpeed, 0, currentFrame, 0);
|
||||||
}
|
}
|
||||||
PlayOneShotScriptObject(SCRIPT_SOUND_BOX_DESTROYED_1, vecPos);
|
PlayOneShotScriptObject(SCRIPT_SOUND_BOX_DESTROYED_1, vecPos);
|
||||||
@ -256,16 +256,16 @@ CObject::ObjectDamage(float amount)
|
|||||||
const RwRGBA color1 = { 200, 0, 0, 255 };
|
const RwRGBA color1 = { 200, 0, 0, 255 };
|
||||||
const RwRGBA color2 = { 200, 200, 200, 255 };
|
const RwRGBA color2 = { 200, 200, 200, 255 };
|
||||||
for (int32 i = 0; i < 10; i++) {
|
for (int32 i = 0; i < 10; i++) {
|
||||||
CVector vecDir(CGeneral::GetRandomNumberInRange(-0.35f, 0.7f),
|
CVector vecDir(CGeneral::GetRandomNumberInRange(-0.35f, 0.35f),
|
||||||
CGeneral::GetRandomNumberInRange(-0.35f, 0.7f),
|
CGeneral::GetRandomNumberInRange(-0.35f, 0.35f),
|
||||||
CGeneral::GetRandomNumberInRange(0.1f, 0.15f) + fDirectionZ);
|
CGeneral::GetRandomNumberInRange(0.1f, 0.25f) + fDirectionZ);
|
||||||
++nFrameGen;
|
++nFrameGen;
|
||||||
int32 currentFrame = nFrameGen & 3;
|
int32 currentFrame = nFrameGen & 3;
|
||||||
RwRGBA color = color2;
|
RwRGBA color = color2;
|
||||||
if (nFrameGen & 1)
|
if (nFrameGen & 1)
|
||||||
color = color1;
|
color = color1;
|
||||||
float fSize = CGeneral::GetRandomNumberInRange(0.02f, 0.18f);
|
float fSize = CGeneral::GetRandomNumberInRange(0.02f, 0.20f);
|
||||||
int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-40, 80);
|
int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-40, 40);
|
||||||
CParticle::AddParticle(PARTICLE_CAR_DEBRIS, vecPos, vecDir, nil, fSize, color, nRotationSpeed, 0, currentFrame, 0);
|
CParticle::AddParticle(PARTICLE_CAR_DEBRIS, vecPos, vecDir, nil, fSize, color, nRotationSpeed, 0, currentFrame, 0);
|
||||||
}
|
}
|
||||||
PlayOneShotScriptObject(SCRIPT_SOUND_TIRE_COLLISION, vecPos);
|
PlayOneShotScriptObject(SCRIPT_SOUND_TIRE_COLLISION, vecPos);
|
||||||
@ -281,16 +281,16 @@ CObject::ObjectDamage(float amount)
|
|||||||
const RwRGBA color1 = { 200, 0, 0, 255 };
|
const RwRGBA color1 = { 200, 0, 0, 255 };
|
||||||
const RwRGBA color2 = { 200, 200, 200, 255 };
|
const RwRGBA color2 = { 200, 200, 200, 255 };
|
||||||
for (int32 i = 0; i < 32; i++) {
|
for (int32 i = 0; i < 32; i++) {
|
||||||
CVector vecDir(CGeneral::GetRandomNumberInRange(-0.35f, 0.7f),
|
CVector vecDir(CGeneral::GetRandomNumberInRange(-0.35f, 0.35f),
|
||||||
CGeneral::GetRandomNumberInRange(-0.35f, 0.7f),
|
CGeneral::GetRandomNumberInRange(-0.35f, 0.35f),
|
||||||
CGeneral::GetRandomNumberInRange(0.1f, 0.15f) + fDirectionZ);
|
CGeneral::GetRandomNumberInRange(0.1f, 0.25f) + fDirectionZ);
|
||||||
++nFrameGen;
|
++nFrameGen;
|
||||||
int32 currentFrame = nFrameGen & 3;
|
int32 currentFrame = nFrameGen & 3;
|
||||||
RwRGBA color = color2;
|
RwRGBA color = color2;
|
||||||
if (nFrameGen & 1)
|
if (nFrameGen & 1)
|
||||||
color = color1;
|
color = color1;
|
||||||
float fSize = CGeneral::GetRandomNumberInRange(0.02f, 0.18f);
|
float fSize = CGeneral::GetRandomNumberInRange(0.02f, 0.20f);
|
||||||
int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-40, 80);
|
int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-40, 40);
|
||||||
CParticle::AddParticle(PARTICLE_CAR_DEBRIS, vecPos, vecDir, nil, fSize, color, nRotationSpeed, 0, currentFrame, 0);
|
CParticle::AddParticle(PARTICLE_CAR_DEBRIS, vecPos, vecDir, nil, fSize, color, nRotationSpeed, 0, currentFrame, 0);
|
||||||
}
|
}
|
||||||
PlayOneShotScriptObject(SCRIPT_SOUND_METAL_COLLISION, vecPos);
|
PlayOneShotScriptObject(SCRIPT_SOUND_METAL_COLLISION, vecPos);
|
||||||
@ -389,7 +389,7 @@ CObject::DeleteAllTempObjectsInArea(CVector point, float fRadius)
|
|||||||
CObjectPool *objectPool = CPools::GetObjectPool();
|
CObjectPool *objectPool = CPools::GetObjectPool();
|
||||||
for (int32 i = 0; i < objectPool->GetSize(); i++) {
|
for (int32 i = 0; i < objectPool->GetSize(); i++) {
|
||||||
CObject *pObject = objectPool->GetSlot(i);
|
CObject *pObject = objectPool->GetSlot(i);
|
||||||
if (pObject && pObject->ObjectCreatedBy == TEMP_OBJECT && fRadius * fRadius > pObject->GetPosition().MagnitudeSqr()) {
|
if (pObject && pObject->ObjectCreatedBy == TEMP_OBJECT && (point - pObject->GetPosition()).MagnitudeSqr() < SQR(fRadius)) {
|
||||||
CWorld::Remove(pObject);
|
CWorld::Remove(pObject);
|
||||||
delete pObject;
|
delete pObject;
|
||||||
}
|
}
|
||||||
|
@ -274,7 +274,7 @@ CCivilianPed::ProcessControl(void)
|
|||||||
} else {
|
} else {
|
||||||
crimeReporters[m_phoneId] = this;
|
crimeReporters[m_phoneId] = this;
|
||||||
m_facePhoneStart = true;
|
m_facePhoneStart = true;
|
||||||
m_nPedState = PED_FACE_PHONE;
|
SetPedState(PED_FACE_PHONE);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
} else if (bRunningToPhone) {
|
} else if (bRunningToPhone) {
|
||||||
@ -283,7 +283,7 @@ CCivilianPed::ProcessControl(void)
|
|||||||
m_phoneId = -1;
|
m_phoneId = -1;
|
||||||
} else {
|
} else {
|
||||||
gPhoneInfo.m_aPhones[m_phoneId].m_nState = PHONE_STATE_REPORTING_CRIME;
|
gPhoneInfo.m_aPhones[m_phoneId].m_nState = PHONE_STATE_REPORTING_CRIME;
|
||||||
m_nPedState = PED_FACE_PHONE;
|
SetPedState(PED_FACE_PHONE);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
} else if (m_objective != OBJECTIVE_KILL_CHAR_ANY_MEANS && m_objective != OBJECTIVE_KILL_CHAR_ON_FOOT) {
|
} else if (m_objective != OBJECTIVE_KILL_CHAR_ANY_MEANS && m_objective != OBJECTIVE_KILL_CHAR_ON_FOOT) {
|
||||||
@ -305,7 +305,7 @@ CCivilianPed::ProcessControl(void)
|
|||||||
break;
|
break;
|
||||||
case PED_FACE_PHONE:
|
case PED_FACE_PHONE:
|
||||||
if (FacePhone())
|
if (FacePhone())
|
||||||
m_nPedState = PED_MAKE_CALL;
|
SetPedState(PED_MAKE_CALL);
|
||||||
break;
|
break;
|
||||||
case PED_MAKE_CALL:
|
case PED_MAKE_CALL:
|
||||||
if (MakePhonecall())
|
if (MakePhonecall())
|
||||||
@ -331,7 +331,7 @@ CCivilianPed::ProcessControl(void)
|
|||||||
for (int j = 0; j < m_numNearPeds; ++j) {
|
for (int j = 0; j < m_numNearPeds; ++j) {
|
||||||
CPed *nearPed = m_nearPeds[j];
|
CPed *nearPed = m_nearPeds[j];
|
||||||
if (nearPed->m_nPedType == m_nPedType && nearPed->m_nPedState == PED_WANDER_PATH) {
|
if (nearPed->m_nPedType == m_nPedType && nearPed->m_nPedState == PED_WANDER_PATH) {
|
||||||
nearPed->m_nPedState = PED_UNKNOWN;
|
nearPed->SetPedState(PED_UNKNOWN);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -69,7 +69,7 @@ CCopPed::CCopPed(eCopType copType) : CPed(PEDTYPE_COP)
|
|||||||
m_bStopAndShootDisabledZone = false;
|
m_bStopAndShootDisabledZone = false;
|
||||||
m_bZoneDisabled = false;
|
m_bZoneDisabled = false;
|
||||||
field_1364 = -1;
|
field_1364 = -1;
|
||||||
m_pPointGunAt = nil;
|
SetWeaponLockOnTarget(nil);
|
||||||
|
|
||||||
// VC also initializes in here, but as nil
|
// VC also initializes in here, but as nil
|
||||||
#ifdef FIX_BUGS
|
#ifdef FIX_BUGS
|
||||||
@ -114,14 +114,14 @@ CCopPed::SetArrestPlayer(CPed *player)
|
|||||||
|
|
||||||
} else if (player->m_nPedState != PED_DIE && player->m_nPedState != PED_DEAD && player->m_nPedState != PED_ARRESTED) {
|
} else if (player->m_nPedState != PED_DIE && player->m_nPedState != PED_DEAD && player->m_nPedState != PED_ARRESTED) {
|
||||||
player->m_nLastPedState = player->m_nPedState;
|
player->m_nLastPedState = player->m_nPedState;
|
||||||
player->m_nPedState = PED_ARRESTED;
|
player->SetPedState(PED_ARRESTED);
|
||||||
|
|
||||||
FindPlayerPed()->m_bCanBeDamaged = false;
|
FindPlayerPed()->m_bCanBeDamaged = false;
|
||||||
((CPlayerPed*)player)->m_pArrestingCop = this;
|
((CPlayerPed*)player)->m_pArrestingCop = this;
|
||||||
this->RegisterReference((CEntity**) &((CPlayerPed*)player)->m_pArrestingCop);
|
this->RegisterReference((CEntity**) &((CPlayerPed*)player)->m_pArrestingCop);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_nPedState = PED_ARREST_PLAYER;
|
SetPedState(PED_ARREST_PLAYER);
|
||||||
SetObjective(OBJECTIVE_NONE);
|
SetObjective(OBJECTIVE_NONE);
|
||||||
m_prevObjective = OBJECTIVE_NONE;
|
m_prevObjective = OBJECTIVE_NONE;
|
||||||
bIsPointingGunAt = false;
|
bIsPointingGunAt = false;
|
||||||
@ -229,7 +229,7 @@ CCopPed::ArrestPlayer(void)
|
|||||||
CPed *suspect = (CPed*)m_pSeekTarget;
|
CPed *suspect = (CPed*)m_pSeekTarget;
|
||||||
if (suspect) {
|
if (suspect) {
|
||||||
if (suspect->CanSetPedState())
|
if (suspect->CanSetPedState())
|
||||||
suspect->m_nPedState = PED_ARRESTED;
|
suspect->SetPedState(PED_ARRESTED);
|
||||||
|
|
||||||
if (suspect->bInVehicle && m_pMyVehicle && suspect->m_pMyVehicle == m_pMyVehicle) {
|
if (suspect->bInVehicle && m_pMyVehicle && suspect->m_pMyVehicle == m_pMyVehicle) {
|
||||||
|
|
||||||
@ -244,7 +244,7 @@ CCopPed::ArrestPlayer(void)
|
|||||||
CAnimManager::BlendAnimation(GetClump(), ASSOCGRP_STD, ANIM_ARREST_GUN, 4.0f);
|
CAnimManager::BlendAnimation(GetClump(), ASSOCGRP_STD, ANIM_ARREST_GUN, 4.0f);
|
||||||
|
|
||||||
CVector suspMidPos;
|
CVector suspMidPos;
|
||||||
suspect->m_pedIK.GetComponentPosition((RwV3d*)suspMidPos, PED_MID);
|
suspect->m_pedIK.GetComponentPosition(suspMidPos, PED_MID);
|
||||||
m_fRotationDest = CGeneral::GetRadianAngleBetweenPoints(suspMidPos.x, suspMidPos.y,
|
m_fRotationDest = CGeneral::GetRadianAngleBetweenPoints(suspMidPos.x, suspMidPos.y,
|
||||||
GetPosition().x, GetPosition().y);
|
GetPosition().x, GetPosition().y);
|
||||||
|
|
||||||
@ -472,10 +472,7 @@ CCopPed::CopAI(void)
|
|||||||
if (!CWorld::ProcessLineOfSight(gunPos, playerOrHisVeh->GetPosition(), foundCol, foundEnt,
|
if (!CWorld::ProcessLineOfSight(gunPos, playerOrHisVeh->GetPosition(), foundCol, foundEnt,
|
||||||
false, true, false, false, true, false, false)
|
false, true, false, false, true, false, false)
|
||||||
|| foundEnt && foundEnt == playerOrHisVeh) {
|
|| foundEnt && foundEnt == playerOrHisVeh) {
|
||||||
m_pPointGunAt = playerOrHisVeh;
|
SetWeaponLockOnTarget(playerOrHisVeh);
|
||||||
if (playerOrHisVeh)
|
|
||||||
playerOrHisVeh->RegisterReference((CEntity**) &m_pPointGunAt);
|
|
||||||
|
|
||||||
SetAttack(playerOrHisVeh);
|
SetAttack(playerOrHisVeh);
|
||||||
SetShootTimer(CGeneral::GetRandomNumberInRange(500, 1000));
|
SetShootTimer(CGeneral::GetRandomNumberInRange(500, 1000));
|
||||||
}
|
}
|
||||||
|
@ -100,7 +100,7 @@ CEmergencyPed::FiremanAI(void)
|
|||||||
case EMERGENCY_PED_READY:
|
case EMERGENCY_PED_READY:
|
||||||
nearestFire = gFireManager.FindNearestFire(GetPosition(), &fireDist);
|
nearestFire = gFireManager.FindNearestFire(GetPosition(), &fireDist);
|
||||||
if (nearestFire) {
|
if (nearestFire) {
|
||||||
m_nPedState = PED_NONE;
|
SetPedState(PED_NONE);
|
||||||
SetSeek(nearestFire->m_vecPos, 1.0f);
|
SetSeek(nearestFire->m_vecPos, 1.0f);
|
||||||
SetMoveState(PEDMOVE_RUN);
|
SetMoveState(PEDMOVE_RUN);
|
||||||
m_nEmergencyPedState = EMERGENCY_PED_DETERMINE_NEXT_STATE;
|
m_nEmergencyPedState = EMERGENCY_PED_DETERMINE_NEXT_STATE;
|
||||||
@ -114,7 +114,7 @@ CEmergencyPed::FiremanAI(void)
|
|||||||
case EMERGENCY_PED_DETERMINE_NEXT_STATE:
|
case EMERGENCY_PED_DETERMINE_NEXT_STATE:
|
||||||
nearestFire = gFireManager.FindNearestFire(GetPosition(), &fireDist);
|
nearestFire = gFireManager.FindNearestFire(GetPosition(), &fireDist);
|
||||||
if (nearestFire && nearestFire != m_pAttendedFire) {
|
if (nearestFire && nearestFire != m_pAttendedFire) {
|
||||||
m_nPedState = PED_NONE;
|
SetPedState(PED_NONE);
|
||||||
SetSeek(nearestFire->m_vecPos, 1.0f);
|
SetSeek(nearestFire->m_vecPos, 1.0f);
|
||||||
SetMoveState(PEDMOVE_RUN);
|
SetMoveState(PEDMOVE_RUN);
|
||||||
#ifdef FIX_BUGS
|
#ifdef FIX_BUGS
|
||||||
@ -160,7 +160,7 @@ CEmergencyPed::FiremanAI(void)
|
|||||||
#endif
|
#endif
|
||||||
--m_pAttendedFire->m_nFiremenPuttingOut;
|
--m_pAttendedFire->m_nFiremenPuttingOut;
|
||||||
|
|
||||||
m_nPedState = PED_NONE;
|
SetPedState(PED_NONE);
|
||||||
SetWanderPath(CGeneral::GetRandomNumber() & 7);
|
SetWanderPath(CGeneral::GetRandomNumber() & 7);
|
||||||
m_pAttendedFire = nil;
|
m_pAttendedFire = nil;
|
||||||
m_nEmergencyPedState = EMERGENCY_PED_READY;
|
m_nEmergencyPedState = EMERGENCY_PED_READY;
|
||||||
@ -234,8 +234,8 @@ CEmergencyPed::MedicAI(void)
|
|||||||
if (nearestAccident) {
|
if (nearestAccident) {
|
||||||
m_pRevivedPed = nearestAccident->m_pVictim;
|
m_pRevivedPed = nearestAccident->m_pVictim;
|
||||||
m_pRevivedPed->RegisterReference((CEntity**)&m_pRevivedPed);
|
m_pRevivedPed->RegisterReference((CEntity**)&m_pRevivedPed);
|
||||||
m_pRevivedPed->m_pedIK.GetComponentPosition((RwV3d*)&midPos, PED_MID);
|
m_pRevivedPed->m_pedIK.GetComponentPosition(midPos, PED_MID);
|
||||||
m_pRevivedPed->m_pedIK.GetComponentPosition((RwV3d*)&headPos, PED_HEAD);
|
m_pRevivedPed->m_pedIK.GetComponentPosition(headPos, PED_HEAD);
|
||||||
SetSeek((headPos + midPos) * 0.5f, 1.0f);
|
SetSeek((headPos + midPos) * 0.5f, 1.0f);
|
||||||
SetObjective(OBJECTIVE_NONE);
|
SetObjective(OBJECTIVE_NONE);
|
||||||
bIsRunning = true;
|
bIsRunning = true;
|
||||||
@ -274,8 +274,8 @@ CEmergencyPed::MedicAI(void)
|
|||||||
m_nEmergencyPedState = EMERGENCY_PED_STOP;
|
m_nEmergencyPedState = EMERGENCY_PED_STOP;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
m_pRevivedPed->m_pedIK.GetComponentPosition((RwV3d*)&midPos, PED_MID);
|
m_pRevivedPed->m_pedIK.GetComponentPosition(midPos, PED_MID);
|
||||||
m_pRevivedPed->m_pedIK.GetComponentPosition((RwV3d*)&headPos, PED_HEAD);
|
m_pRevivedPed->m_pedIK.GetComponentPosition(headPos, PED_HEAD);
|
||||||
SetSeek((headPos + midPos) * 0.5f, nearestAccident->m_nMedicsPerformingCPR * 0.5f + 1.0f);
|
SetSeek((headPos + midPos) * 0.5f, nearestAccident->m_nMedicsPerformingCPR * 0.5f + 1.0f);
|
||||||
SetObjective(OBJECTIVE_NONE);
|
SetObjective(OBJECTIVE_NONE);
|
||||||
bIsRunning = true;
|
bIsRunning = true;
|
||||||
@ -307,7 +307,7 @@ CEmergencyPed::MedicAI(void)
|
|||||||
} else {
|
} else {
|
||||||
m_pRevivedPed->m_bloodyFootprintCountOrDeathTime = CTimer::GetTimeInMilliseconds();
|
m_pRevivedPed->m_bloodyFootprintCountOrDeathTime = CTimer::GetTimeInMilliseconds();
|
||||||
SetMoveState(PEDMOVE_STILL);
|
SetMoveState(PEDMOVE_STILL);
|
||||||
m_nPedState = PED_CPR;
|
SetPedState(PED_CPR);
|
||||||
m_nLastPedState = PED_CPR;
|
m_nLastPedState = PED_CPR;
|
||||||
SetLookFlag(m_pRevivedPed, 0);
|
SetLookFlag(m_pRevivedPed, 0);
|
||||||
SetLookTimer(500);
|
SetLookTimer(500);
|
||||||
@ -329,8 +329,8 @@ CEmergencyPed::MedicAI(void)
|
|||||||
if (!m_pRevivedPed || m_pRevivedPed->m_fHealth > 0.0f)
|
if (!m_pRevivedPed || m_pRevivedPed->m_fHealth > 0.0f)
|
||||||
m_nEmergencyPedState = EMERGENCY_PED_DETERMINE_NEXT_STATE;
|
m_nEmergencyPedState = EMERGENCY_PED_DETERMINE_NEXT_STATE;
|
||||||
else {
|
else {
|
||||||
m_pRevivedPed->m_pedIK.GetComponentPosition((RwV3d*)&midPos, PED_MID);
|
m_pRevivedPed->m_pedIK.GetComponentPosition(midPos, PED_MID);
|
||||||
m_pRevivedPed->m_pedIK.GetComponentPosition((RwV3d*)&headPos, PED_HEAD);
|
m_pRevivedPed->m_pedIK.GetComponentPosition(headPos, PED_HEAD);
|
||||||
midPos = (headPos + midPos) * 0.5f;
|
midPos = (headPos + midPos) * 0.5f;
|
||||||
m_fRotationDest = CGeneral::GetRadianAngleBetweenPoints(
|
m_fRotationDest = CGeneral::GetRadianAngleBetweenPoints(
|
||||||
midPos.x, midPos.y,
|
midPos.x, midPos.y,
|
||||||
@ -351,8 +351,8 @@ CEmergencyPed::MedicAI(void)
|
|||||||
m_nEmergencyPedState = EMERGENCY_PED_DETERMINE_NEXT_STATE;
|
m_nEmergencyPedState = EMERGENCY_PED_DETERMINE_NEXT_STATE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
m_pRevivedPed->m_pedIK.GetComponentPosition((RwV3d*)&midPos, PED_MID);
|
m_pRevivedPed->m_pedIK.GetComponentPosition(midPos, PED_MID);
|
||||||
m_pRevivedPed->m_pedIK.GetComponentPosition((RwV3d*)&headPos, PED_HEAD);
|
m_pRevivedPed->m_pedIK.GetComponentPosition(headPos, PED_HEAD);
|
||||||
midPos = (headPos + midPos) * 0.5f;
|
midPos = (headPos + midPos) * 0.5f;
|
||||||
m_fRotationDest = CGeneral::GetRadianAngleBetweenPoints(
|
m_fRotationDest = CGeneral::GetRadianAngleBetweenPoints(
|
||||||
midPos.x, midPos.y,
|
midPos.x, midPos.y,
|
||||||
@ -366,12 +366,12 @@ CEmergencyPed::MedicAI(void)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
m_nEmergencyPedState = EMERGENCY_PED_STOP_CPR;
|
m_nEmergencyPedState = EMERGENCY_PED_STOP_CPR;
|
||||||
m_nPedState = PED_NONE;
|
SetPedState(PED_NONE);
|
||||||
SetMoveState(PEDMOVE_WALK);
|
SetMoveState(PEDMOVE_WALK);
|
||||||
m_pVehicleAnim = nil;
|
m_pVehicleAnim = nil;
|
||||||
if (!m_pRevivedPed->bBodyPartJustCameOff) {
|
if (!m_pRevivedPed->bBodyPartJustCameOff) {
|
||||||
m_pRevivedPed->m_fHealth = 100.0f;
|
m_pRevivedPed->m_fHealth = 100.0f;
|
||||||
m_pRevivedPed->m_nPedState = PED_NONE;
|
m_pRevivedPed->SetPedState(PED_NONE);
|
||||||
m_pRevivedPed->m_nLastPedState = PED_WANDER_PATH;
|
m_pRevivedPed->m_nLastPedState = PED_WANDER_PATH;
|
||||||
m_pRevivedPed->SetGetUp();
|
m_pRevivedPed->SetGetUp();
|
||||||
m_pRevivedPed->bUsesCollision = true;
|
m_pRevivedPed->bUsesCollision = true;
|
||||||
@ -400,7 +400,7 @@ CEmergencyPed::MedicAI(void)
|
|||||||
break;
|
break;
|
||||||
case EMERGENCY_PED_STOP:
|
case EMERGENCY_PED_STOP:
|
||||||
m_bStartedToCPR = false;
|
m_bStartedToCPR = false;
|
||||||
m_nPedState = PED_NONE;
|
SetPedState(PED_NONE);
|
||||||
if (m_pAttendedAccident) {
|
if (m_pAttendedAccident) {
|
||||||
m_pAttendedAccident->m_pVictim = nil;
|
m_pAttendedAccident->m_pVictim = nil;
|
||||||
--m_pAttendedAccident->m_nMedicsAttending;
|
--m_pAttendedAccident->m_nMedicsAttending;
|
||||||
|
101
src/peds/Ped.cpp
101
src/peds/Ped.cpp
@ -641,7 +641,7 @@ CPed::RestorePreviousState(void)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if (InVehicle()) {
|
if (InVehicle()) {
|
||||||
m_nPedState = PED_DRIVING;
|
SetPedState(PED_DRIVING);
|
||||||
m_nLastPedState = PED_NONE;
|
m_nLastPedState = PED_NONE;
|
||||||
} else {
|
} else {
|
||||||
if (m_nLastPedState == PED_NONE) {
|
if (m_nLastPedState == PED_NONE) {
|
||||||
@ -658,7 +658,7 @@ CPed::RestorePreviousState(void)
|
|||||||
SetIdle();
|
SetIdle();
|
||||||
break;
|
break;
|
||||||
case PED_WANDER_PATH:
|
case PED_WANDER_PATH:
|
||||||
m_nPedState = PED_WANDER_PATH;
|
SetPedState(PED_WANDER_PATH);
|
||||||
bIsRunning = false;
|
bIsRunning = false;
|
||||||
if (bFindNewNodeAfterStateRestore) {
|
if (bFindNewNodeAfterStateRestore) {
|
||||||
if (m_pNextPathNode) {
|
if (m_pNextPathNode) {
|
||||||
@ -672,7 +672,7 @@ CPed::RestorePreviousState(void)
|
|||||||
SetWanderPath(CGeneral::GetRandomNumber() & 7);
|
SetWanderPath(CGeneral::GetRandomNumber() & 7);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
m_nPedState = m_nLastPedState;
|
SetPedState(m_nLastPedState);
|
||||||
SetMoveState((eMoveState) m_nPrevMoveState);
|
SetMoveState((eMoveState) m_nPrevMoveState);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -960,7 +960,7 @@ CPed::MoveHeadToLook(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (m_pLookTarget->IsPed()) {
|
if (m_pLookTarget->IsPed()) {
|
||||||
((CPed*)m_pLookTarget)->m_pedIK.GetComponentPosition((RwV3d*) &lookPos, PED_MID);
|
((CPed*)m_pLookTarget)->m_pedIK.GetComponentPosition(lookPos, PED_MID);
|
||||||
} else {
|
} else {
|
||||||
lookPos = m_pLookTarget->GetPosition();
|
lookPos = m_pLookTarget->GetPosition();
|
||||||
}
|
}
|
||||||
@ -1511,8 +1511,8 @@ CPed::ClearAll(void)
|
|||||||
if (!IsPedInControl() && m_nPedState != PED_DEAD)
|
if (!IsPedInControl() && m_nPedState != PED_DEAD)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
m_nPedState = PED_NONE;
|
SetPedState(PED_NONE);
|
||||||
m_nMoveState = PEDMOVE_NONE;
|
SetMoveState(PEDMOVE_NONE);
|
||||||
m_pSeekTarget = nil;
|
m_pSeekTarget = nil;
|
||||||
m_vecSeekPos = CVector(0.0f, 0.0f, 0.0f);
|
m_vecSeekPos = CVector(0.0f, 0.0f, 0.0f);
|
||||||
m_fleeFromPosX = 0.0f;
|
m_fleeFromPosX = 0.0f;
|
||||||
@ -1585,7 +1585,7 @@ CPed::ProcessBuoyancy(void)
|
|||||||
CParticleObject::AddObject(POBJECT_PED_WATER_SPLASH, pos, CVector(0.0f, 0.0f, 0.0f), 0.0f, 50, CRGBA(0, 0, 0, 0), true);
|
CParticleObject::AddObject(POBJECT_PED_WATER_SPLASH, pos, CVector(0.0f, 0.0f, 0.0f), 0.0f, 50, CRGBA(0, 0, 0, 0), true);
|
||||||
#endif
|
#endif
|
||||||
m_vecMoveSpeed = CVector(0.0f, 0.0f, 0.0f);
|
m_vecMoveSpeed = CVector(0.0f, 0.0f, 0.0f);
|
||||||
m_nPedState = PED_IDLE;
|
SetPedState(PED_IDLE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2692,36 +2692,6 @@ CPed::ProcessControl(void)
|
|||||||
case PED_WANDER_PATH:
|
case PED_WANDER_PATH:
|
||||||
WanderPath();
|
WanderPath();
|
||||||
break;
|
break;
|
||||||
case PED_SEEK_POS:
|
|
||||||
case PED_SEEK_ENTITY:
|
|
||||||
case PED_PURSUE:
|
|
||||||
case PED_SNIPER_MODE:
|
|
||||||
case PED_ROCKET_MODE:
|
|
||||||
case PED_DUMMY:
|
|
||||||
case PED_FACE_PHONE:
|
|
||||||
case PED_MAKE_CALL:
|
|
||||||
case PED_MUG:
|
|
||||||
case PED_AI_CONTROL:
|
|
||||||
case PED_FOLLOW_ROUTE:
|
|
||||||
case PED_CPR:
|
|
||||||
case PED_SOLICIT:
|
|
||||||
case PED_BUY_ICECREAM:
|
|
||||||
case PED_STEP_AWAY:
|
|
||||||
case PED_UNKNOWN:
|
|
||||||
case PED_STATES_NO_AI:
|
|
||||||
case PED_JUMP:
|
|
||||||
case PED_STAGGER:
|
|
||||||
case PED_DIVE_AWAY:
|
|
||||||
case PED_STATES_NO_ST:
|
|
||||||
case PED_ARREST_PLAYER:
|
|
||||||
case PED_PASSENGER:
|
|
||||||
case PED_TAXI_PASSENGER:
|
|
||||||
case PED_OPEN_DOOR:
|
|
||||||
case PED_DEAD:
|
|
||||||
case PED_DRAG_FROM_CAR:
|
|
||||||
case PED_EXIT_CAR:
|
|
||||||
case PED_STEAL_CAR:
|
|
||||||
break;
|
|
||||||
case PED_ENTER_CAR:
|
case PED_ENTER_CAR:
|
||||||
case PED_CARJACK:
|
case PED_CARJACK:
|
||||||
{
|
{
|
||||||
@ -4467,7 +4437,7 @@ CPed::PedSetInCarCB(CAnimBlendAssociation *animAssoc, void *arg)
|
|||||||
if (!veh->bEngineOn)
|
if (!veh->bEngineOn)
|
||||||
veh->bEngineOn = true;
|
veh->bEngineOn = true;
|
||||||
|
|
||||||
ped->m_nPedState = PED_DRIVING;
|
ped->SetPedState(PED_DRIVING);
|
||||||
ped->StopNonPartialAnims();
|
ped->StopNonPartialAnims();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -4512,7 +4482,7 @@ CPed::PedSetInCarCB(CAnimBlendAssociation *animAssoc, void *arg)
|
|||||||
else if (ped->m_objective == OBJECTIVE_ENTER_CAR_AS_PASSENGER) {
|
else if (ped->m_objective == OBJECTIVE_ENTER_CAR_AS_PASSENGER) {
|
||||||
if (ped->m_nPedState == PED_CARJACK) {
|
if (ped->m_nPedState == PED_CARJACK) {
|
||||||
veh->AddPassenger(ped, 0);
|
veh->AddPassenger(ped, 0);
|
||||||
ped->m_nPedState = PED_DRIVING;
|
ped->SetPedState(PED_DRIVING);
|
||||||
ped->RestorePreviousObjective();
|
ped->RestorePreviousObjective();
|
||||||
ped->SetObjective(OBJECTIVE_LEAVE_CAR, veh);
|
ped->SetObjective(OBJECTIVE_LEAVE_CAR, veh);
|
||||||
} else if (veh->pDriver && ped->CharCreatedBy == RANDOM_CHAR) {
|
} else if (veh->pDriver && ped->CharCreatedBy == RANDOM_CHAR) {
|
||||||
@ -4552,7 +4522,7 @@ CPed::PedSetInCarCB(CAnimBlendAssociation *animAssoc, void *arg)
|
|||||||
veh->AutoPilot.m_nDrivingStyle = DRIVINGSTYLE_AVOID_CARS;
|
veh->AutoPilot.m_nDrivingStyle = DRIVINGSTYLE_AVOID_CARS;
|
||||||
veh->AutoPilot.m_nCruiseSpeed = 25;
|
veh->AutoPilot.m_nCruiseSpeed = 25;
|
||||||
}
|
}
|
||||||
ped->m_nPedState = PED_DRIVING;
|
ped->SetPedState(PED_DRIVING);
|
||||||
if (ped->m_objective == OBJECTIVE_ENTER_CAR_AS_DRIVER) {
|
if (ped->m_objective == OBJECTIVE_ENTER_CAR_AS_DRIVER) {
|
||||||
|
|
||||||
if (ped->m_prevObjective == OBJECTIVE_RUN_TO_AREA || ped->m_prevObjective == OBJECTIVE_GOTO_CHAR_ON_FOOT || ped->m_prevObjective == OBJECTIVE_KILL_CHAR_ON_FOOT)
|
if (ped->m_prevObjective == OBJECTIVE_RUN_TO_AREA || ped->m_prevObjective == OBJECTIVE_GOTO_CHAR_ON_FOOT || ped->m_prevObjective == OBJECTIVE_KILL_CHAR_ON_FOOT)
|
||||||
@ -4580,7 +4550,7 @@ CPed::PedSetInCarCB(CAnimBlendAssociation *animAssoc, void *arg)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ped->m_nPedState = PED_DRIVING;
|
ped->SetPedState(PED_DRIVING);
|
||||||
if (ped->m_prevObjective == OBJECTIVE_RUN_TO_AREA || ped->m_prevObjective == OBJECTIVE_GOTO_CHAR_ON_FOOT || ped->m_prevObjective == OBJECTIVE_KILL_CHAR_ON_FOOT)
|
if (ped->m_prevObjective == OBJECTIVE_RUN_TO_AREA || ped->m_prevObjective == OBJECTIVE_GOTO_CHAR_ON_FOOT || ped->m_prevObjective == OBJECTIVE_KILL_CHAR_ON_FOOT)
|
||||||
ped->m_prevObjective = OBJECTIVE_NONE;
|
ped->m_prevObjective = OBJECTIVE_NONE;
|
||||||
|
|
||||||
@ -4967,7 +4937,7 @@ CPed::SetIdle(void)
|
|||||||
|
|
||||||
m_nLastPedState = PED_NONE;
|
m_nLastPedState = PED_NONE;
|
||||||
#endif
|
#endif
|
||||||
m_nPedState = PED_IDLE;
|
SetPedState(PED_IDLE);
|
||||||
SetMoveState(PEDMOVE_STILL);
|
SetMoveState(PEDMOVE_STILL);
|
||||||
}
|
}
|
||||||
if (m_nWaitState == WAITSTATE_FALSE) {
|
if (m_nWaitState == WAITSTATE_FALSE) {
|
||||||
@ -5055,7 +5025,7 @@ CPed::SetFall(int extraTime, AnimationId animId, uint8 evenIfNotInControl)
|
|||||||
ClearLookFlag();
|
ClearLookFlag();
|
||||||
ClearAimFlag();
|
ClearAimFlag();
|
||||||
SetStoredState();
|
SetStoredState();
|
||||||
m_nPedState = PED_FALL;
|
SetPedState(PED_FALL);
|
||||||
CAnimBlendAssociation *fallAssoc = RpAnimBlendClumpGetAssociation(GetClump(), animId);
|
CAnimBlendAssociation *fallAssoc = RpAnimBlendClumpGetAssociation(GetClump(), animId);
|
||||||
|
|
||||||
if (fallAssoc) {
|
if (fallAssoc) {
|
||||||
@ -5220,7 +5190,7 @@ CPed::SetGetUp(void)
|
|||||||
}
|
}
|
||||||
if (m_nPedState != PED_GETUP) {
|
if (m_nPedState != PED_GETUP) {
|
||||||
SetStoredState();
|
SetStoredState();
|
||||||
m_nPedState = PED_GETUP;
|
SetPedState(PED_GETUP);
|
||||||
}
|
}
|
||||||
|
|
||||||
CVehicle *collidingVeh = (CVehicle*)m_pCollidingEntity;
|
CVehicle *collidingVeh = (CVehicle*)m_pCollidingEntity;
|
||||||
@ -5375,7 +5345,7 @@ CPed::SetSeek(CVector pos, float distanceToCountDone)
|
|||||||
if (m_nPedState != PED_SEEK_POS)
|
if (m_nPedState != PED_SEEK_POS)
|
||||||
SetStoredState();
|
SetStoredState();
|
||||||
|
|
||||||
m_nPedState = PED_SEEK_POS;
|
SetPedState(PED_SEEK_POS);
|
||||||
m_distanceToCountSeekDone = distanceToCountDone;
|
m_distanceToCountSeekDone = distanceToCountDone;
|
||||||
m_vecSeekPos = pos;
|
m_vecSeekPos = pos;
|
||||||
}
|
}
|
||||||
@ -5395,7 +5365,7 @@ CPed::SetSeek(CEntity *seeking, float distanceToCountDone)
|
|||||||
if (m_nPedState != PED_SEEK_ENTITY)
|
if (m_nPedState != PED_SEEK_ENTITY)
|
||||||
SetStoredState();
|
SetStoredState();
|
||||||
|
|
||||||
m_nPedState = PED_SEEK_ENTITY;
|
SetPedState(PED_SEEK_ENTITY);
|
||||||
m_distanceToCountSeekDone = distanceToCountDone;
|
m_distanceToCountSeekDone = distanceToCountDone;
|
||||||
m_pSeekTarget = seeking;
|
m_pSeekTarget = seeking;
|
||||||
m_pSeekTarget->RegisterReference((CEntity **) &m_pSeekTarget);
|
m_pSeekTarget->RegisterReference((CEntity **) &m_pSeekTarget);
|
||||||
@ -5572,7 +5542,7 @@ CPed::SetFlee(CVector2D const &from, int time)
|
|||||||
|
|
||||||
if (m_nPedState != PED_FLEE_ENTITY) {
|
if (m_nPedState != PED_FLEE_ENTITY) {
|
||||||
SetStoredState();
|
SetStoredState();
|
||||||
m_nPedState = PED_FLEE_POS;
|
SetPedState(PED_FLEE_POS);
|
||||||
SetMoveState(PEDMOVE_RUN);
|
SetMoveState(PEDMOVE_RUN);
|
||||||
m_fleeFromPosX = from.x;
|
m_fleeFromPosX = from.x;
|
||||||
m_fleeFromPosY = from.y;
|
m_fleeFromPosY = from.y;
|
||||||
@ -5601,7 +5571,7 @@ CPed::SetFlee(CEntity *fleeFrom, int time)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
SetStoredState();
|
SetStoredState();
|
||||||
m_nPedState = PED_FLEE_ENTITY;
|
SetPedState(PED_FLEE_ENTITY);
|
||||||
bUsePedNodeSeek = true;
|
bUsePedNodeSeek = true;
|
||||||
SetMoveState(PEDMOVE_RUN);
|
SetMoveState(PEDMOVE_RUN);
|
||||||
m_fleeFrom = fleeFrom;
|
m_fleeFrom = fleeFrom;
|
||||||
@ -5862,7 +5832,7 @@ CPed::SetWanderPath(int8 pathStateDest)
|
|||||||
|
|
||||||
// We did it, save next path state and return true
|
// We did it, save next path state and return true
|
||||||
m_nPathDir = nextPathState;
|
m_nPathDir = nextPathState;
|
||||||
m_nPedState = PED_WANDER_PATH;
|
SetPedState(PED_WANDER_PATH);
|
||||||
SetMoveState(PEDMOVE_WALK);
|
SetMoveState(PEDMOVE_WALK);
|
||||||
bIsRunning = false;
|
bIsRunning = false;
|
||||||
return true;
|
return true;
|
||||||
@ -6047,7 +6017,7 @@ CPed::SetFollowPath(CVector dest)
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
SetStoredState();
|
SetStoredState();
|
||||||
m_nPedState = PED_FOLLOW_PATH;
|
SetPedState(PED_FOLLOW_PATH);
|
||||||
SetMoveState(PEDMOVE_WALK);
|
SetMoveState(PEDMOVE_WALK);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -6150,7 +6120,7 @@ CPed::SetEvasiveStep(CEntity *reason, uint8 animType)
|
|||||||
m_fRotationCur = CGeneral::LimitRadianAngle(angleToFace);
|
m_fRotationCur = CGeneral::LimitRadianAngle(angleToFace);
|
||||||
ClearAimFlag();
|
ClearAimFlag();
|
||||||
SetStoredState();
|
SetStoredState();
|
||||||
m_nPedState = PED_STEP_AWAY;
|
SetPedState(PED_STEP_AWAY);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -6247,13 +6217,13 @@ CPed::SetEvasiveDive(CPhysical *reason, uint8 onlyRandomJump)
|
|||||||
animAssoc->flags &= ~ASSOC_DELETEFADEDOUT;
|
animAssoc->flags &= ~ASSOC_DELETEFADEDOUT;
|
||||||
animAssoc->SetFinishCallback(PedEvadeCB, this);
|
animAssoc->SetFinishCallback(PedEvadeCB, this);
|
||||||
SetStoredState();
|
SetStoredState();
|
||||||
m_nPedState = PED_STEP_AWAY;
|
SetPedState(PED_STEP_AWAY);
|
||||||
} else {
|
} else {
|
||||||
m_fRotationCur = angleToFace;
|
m_fRotationCur = angleToFace;
|
||||||
ClearLookFlag();
|
ClearLookFlag();
|
||||||
ClearAimFlag();
|
ClearAimFlag();
|
||||||
SetStoredState();
|
SetStoredState();
|
||||||
m_nPedState = PED_DIVE_AWAY;
|
SetPedState(PED_DIVE_AWAY);
|
||||||
animAssoc = CAnimManager::BlendAnimation(GetClump(), ASSOCGRP_STD, ANIM_EV_DIVE, 8.0f);
|
animAssoc = CAnimManager::BlendAnimation(GetClump(), ASSOCGRP_STD, ANIM_EV_DIVE, 8.0f);
|
||||||
animAssoc->SetFinishCallback(PedEvadeCB, this);
|
animAssoc->SetFinishCallback(PedEvadeCB, this);
|
||||||
}
|
}
|
||||||
@ -6291,7 +6261,7 @@ CPed::PedEvadeCB(CAnimBlendAssociation* animAssoc, void* arg)
|
|||||||
if (ped->m_nPedState == PED_DIVE_AWAY)
|
if (ped->m_nPedState == PED_DIVE_AWAY)
|
||||||
{
|
{
|
||||||
ped->m_getUpTimer = CTimer::GetTimeInMilliseconds() + 1;
|
ped->m_getUpTimer = CTimer::GetTimeInMilliseconds() + 1;
|
||||||
ped->m_nPedState = PED_FALL;
|
ped->SetPedState(PED_FALL);
|
||||||
}
|
}
|
||||||
animAssoc->flags &= ~ASSOC_FADEOUTWHENDONE;
|
animAssoc->flags &= ~ASSOC_FADEOUTWHENDONE;
|
||||||
animAssoc->flags |= ASSOC_DELETEFADEDOUT;
|
animAssoc->flags |= ASSOC_DELETEFADEDOUT;
|
||||||
@ -6342,7 +6312,7 @@ CPed::SetDie(AnimationId animId, float delta, float speed)
|
|||||||
QuitEnteringCar();
|
QuitEnteringCar();
|
||||||
}
|
}
|
||||||
|
|
||||||
m_nPedState = PED_DIE;
|
SetPedState(PED_DIE);
|
||||||
if (animId == NUM_ANIMS) {
|
if (animId == NUM_ANIMS) {
|
||||||
bIsPedDieAnimPlaying = false;
|
bIsPedDieAnimPlaying = false;
|
||||||
} else {
|
} else {
|
||||||
@ -6384,7 +6354,7 @@ CPed::SetDead(void)
|
|||||||
if (m_nPedState == PED_DRIVING)
|
if (m_nPedState == PED_DRIVING)
|
||||||
bIsVisible = false;
|
bIsVisible = false;
|
||||||
|
|
||||||
m_nPedState = PED_DEAD;
|
SetPedState(PED_DEAD);
|
||||||
m_pVehicleAnim = nil;
|
m_pVehicleAnim = nil;
|
||||||
m_pCollidingEntity = nil;
|
m_pCollidingEntity = nil;
|
||||||
|
|
||||||
@ -6417,7 +6387,7 @@ CPed::SetChat(CEntity *chatWith, uint32 time)
|
|||||||
if(m_nPedState != PED_CHAT)
|
if(m_nPedState != PED_CHAT)
|
||||||
SetStoredState();
|
SetStoredState();
|
||||||
|
|
||||||
m_nPedState = PED_CHAT;
|
SetPedState(PED_CHAT);
|
||||||
SetMoveState(PEDMOVE_STILL);
|
SetMoveState(PEDMOVE_STILL);
|
||||||
#if defined VC_PED_PORTS || defined FIX_BUGS
|
#if defined VC_PED_PORTS || defined FIX_BUGS
|
||||||
m_lookTimer = 0;
|
m_lookTimer = 0;
|
||||||
@ -6658,7 +6628,7 @@ CPed::SetSeekCar(CVehicle *car, uint32 doorNode)
|
|||||||
// m_pSeekTarget->RegisterReference((CEntity**) &m_pSeekTarget);
|
// m_pSeekTarget->RegisterReference((CEntity**) &m_pSeekTarget);
|
||||||
m_vehEnterType = doorNode;
|
m_vehEnterType = doorNode;
|
||||||
m_distanceToCountSeekDone = 0.5f;
|
m_distanceToCountSeekDone = 0.5f;
|
||||||
m_nPedState = PED_SEEK_CAR;
|
SetPedState(PED_SEEK_CAR);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -7683,10 +7653,11 @@ CPed::FlagToDestroyWhenNextProcessed(void)
|
|||||||
}
|
}
|
||||||
bInVehicle = false;
|
bInVehicle = false;
|
||||||
m_pMyVehicle = nil;
|
m_pMyVehicle = nil;
|
||||||
|
|
||||||
if (CharCreatedBy == MISSION_CHAR)
|
if (CharCreatedBy == MISSION_CHAR)
|
||||||
m_nPedState = PED_DEAD;
|
SetPedState(PED_DEAD);
|
||||||
else
|
else
|
||||||
m_nPedState = PED_NONE;
|
SetPedState(PED_NONE);
|
||||||
m_pVehicleAnim = nil;
|
m_pVehicleAnim = nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -7710,7 +7681,7 @@ CPed::SetSolicit(uint32 time)
|
|||||||
if(!m_carInObjective->bIsVan && !m_carInObjective->bIsBus)
|
if(!m_carInObjective->bIsVan && !m_carInObjective->bIsBus)
|
||||||
m_pVehicleAnim = CAnimManager::BlendAnimation(GetClump(), ASSOCGRP_STD, ANIM_CAR_HOOKERTALK, 4.0f);
|
m_pVehicleAnim = CAnimManager::BlendAnimation(GetClump(), ASSOCGRP_STD, ANIM_CAR_HOOKERTALK, 4.0f);
|
||||||
|
|
||||||
m_nPedState = PED_SOLICIT;
|
SetPedState(PED_SOLICIT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -7769,7 +7740,7 @@ CPed::SetBuyIceCream(void)
|
|||||||
// Simulating BuyIceCream
|
// Simulating BuyIceCream
|
||||||
CPed* driver = m_carInObjective->pDriver;
|
CPed* driver = m_carInObjective->pDriver;
|
||||||
if (driver) {
|
if (driver) {
|
||||||
m_nPedState = PED_BUY_ICECREAM;
|
SetPedState(PED_BUY_ICECREAM);
|
||||||
bFindNewNodeAfterStateRestore = true;
|
bFindNewNodeAfterStateRestore = true;
|
||||||
SetObjectiveTimer(8000);
|
SetObjectiveTimer(8000);
|
||||||
SetChat(driver, 8000);
|
SetChat(driver, 8000);
|
||||||
@ -7783,7 +7754,7 @@ CPed::SetBuyIceCream(void)
|
|||||||
|
|
||||||
if (Abs(m_fRotationDest - m_fRotationCur) < HALFPI) {
|
if (Abs(m_fRotationDest - m_fRotationCur) < HALFPI) {
|
||||||
m_standardTimer = CTimer::GetTimeInMilliseconds() + 3000;
|
m_standardTimer = CTimer::GetTimeInMilliseconds() + 3000;
|
||||||
m_nPedState = PED_BUY_ICECREAM;
|
SetPedState(PED_BUY_ICECREAM);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -7985,7 +7956,7 @@ CPed::SetJump(void)
|
|||||||
#endif
|
#endif
|
||||||
(m_nSurfaceTouched != SURFACE_STEEP_CLIFF || DotProduct(GetForward(), m_vecDamageNormal) >= 0.0f)) {
|
(m_nSurfaceTouched != SURFACE_STEEP_CLIFF || DotProduct(GetForward(), m_vecDamageNormal) >= 0.0f)) {
|
||||||
SetStoredState();
|
SetStoredState();
|
||||||
m_nPedState = PED_JUMP;
|
SetPedState(PED_JUMP);
|
||||||
CAnimBlendAssociation *jumpAssoc = CAnimManager::BlendAnimation(GetClump(), ASSOCGRP_STD, ANIM_JUMP_LAUNCH, 8.0f);
|
CAnimBlendAssociation *jumpAssoc = CAnimManager::BlendAnimation(GetClump(), ASSOCGRP_STD, ANIM_JUMP_LAUNCH, 8.0f);
|
||||||
jumpAssoc->SetFinishCallback(FinishLaunchCB, this);
|
jumpAssoc->SetFinishCallback(FinishLaunchCB, this);
|
||||||
m_fRotationDest = m_fRotationCur;
|
m_fRotationDest = m_fRotationCur;
|
||||||
@ -8287,7 +8258,7 @@ CPed::WarpPedIntoCar(CVehicle *car)
|
|||||||
m_pMyVehicle->RegisterReference((CEntity **) &m_pMyVehicle);
|
m_pMyVehicle->RegisterReference((CEntity **) &m_pMyVehicle);
|
||||||
m_carInObjective = car;
|
m_carInObjective = car;
|
||||||
m_carInObjective->RegisterReference((CEntity **) &m_carInObjective);
|
m_carInObjective->RegisterReference((CEntity **) &m_carInObjective);
|
||||||
m_nPedState = PED_DRIVING;
|
SetPedState(PED_DRIVING);
|
||||||
bUsesCollision = false;
|
bUsesCollision = false;
|
||||||
bIsInTheAir = false;
|
bIsInTheAir = false;
|
||||||
bVehExitWillBeInstant = true;
|
bVehExitWillBeInstant = true;
|
||||||
|
@ -43,7 +43,7 @@ enum eFormation
|
|||||||
FORMATION_FRONT
|
FORMATION_FRONT
|
||||||
};
|
};
|
||||||
|
|
||||||
enum FightState : int8 {
|
enum FightState {
|
||||||
FIGHTSTATE_MOVE_FINISHED = -2,
|
FIGHTSTATE_MOVE_FINISHED = -2,
|
||||||
FIGHTSTATE_JUST_ATTACKED,
|
FIGHTSTATE_JUST_ATTACKED,
|
||||||
FIGHTSTATE_NO_MOVE,
|
FIGHTSTATE_NO_MOVE,
|
||||||
@ -153,7 +153,7 @@ enum eWaitState {
|
|||||||
WAITSTATE_FINISH_FLEE
|
WAITSTATE_FINISH_FLEE
|
||||||
};
|
};
|
||||||
|
|
||||||
enum eObjective : uint32 {
|
enum eObjective {
|
||||||
OBJECTIVE_NONE,
|
OBJECTIVE_NONE,
|
||||||
OBJECTIVE_WAIT_ON_FOOT,
|
OBJECTIVE_WAIT_ON_FOOT,
|
||||||
OBJECTIVE_FLEE_ON_FOOT_TILL_SAFE,
|
OBJECTIVE_FLEE_ON_FOOT_TILL_SAFE,
|
||||||
@ -212,7 +212,7 @@ enum PedOnGroundState {
|
|||||||
PED_DEAD_ON_THE_FLOOR
|
PED_DEAD_ON_THE_FLOOR
|
||||||
};
|
};
|
||||||
|
|
||||||
enum PointBlankNecessity : uint8 {
|
enum PointBlankNecessity {
|
||||||
NO_POINT_BLANK_PED,
|
NO_POINT_BLANK_PED,
|
||||||
POINT_BLANK_FOR_WANTED_PED,
|
POINT_BLANK_FOR_WANTED_PED,
|
||||||
POINT_BLANK_FOR_SOMEONE_ELSE
|
POINT_BLANK_FOR_SOMEONE_ELSE
|
||||||
@ -484,7 +484,7 @@ public:
|
|||||||
CVector m_vecHitLastPos;
|
CVector m_vecHitLastPos;
|
||||||
uint32 m_curFightMove;
|
uint32 m_curFightMove;
|
||||||
uint8 m_fightButtonPressure;
|
uint8 m_fightButtonPressure;
|
||||||
FightState m_fightState;
|
int8 m_fightState;
|
||||||
bool m_takeAStepAfterAttack;
|
bool m_takeAStepAfterAttack;
|
||||||
CFire *m_pFire;
|
CFire *m_pFire;
|
||||||
CEntity *m_pLookTarget;
|
CEntity *m_pLookTarget;
|
||||||
@ -598,7 +598,7 @@ public:
|
|||||||
#endif
|
#endif
|
||||||
bool CheckForExplosions(CVector2D &area);
|
bool CheckForExplosions(CVector2D &area);
|
||||||
CPed *CheckForGunShots(void);
|
CPed *CheckForGunShots(void);
|
||||||
PointBlankNecessity CheckForPointBlankPeds(CPed*);
|
uint8 CheckForPointBlankPeds(CPed*);
|
||||||
bool CheckIfInTheAir(void);
|
bool CheckIfInTheAir(void);
|
||||||
void ClearAll(void);
|
void ClearAll(void);
|
||||||
void SetPointGunAt(CEntity*);
|
void SetPointGunAt(CEntity*);
|
||||||
@ -863,6 +863,13 @@ public:
|
|||||||
SetMoveState(PEDMOVE_WALK);
|
SetMoveState(PEDMOVE_WALK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void SetWeaponLockOnTarget(CEntity *target)
|
||||||
|
{
|
||||||
|
m_pPointGunAt = (CPed *)target;
|
||||||
|
if(target)
|
||||||
|
((CEntity *)target)->RegisterReference(&m_pPointGunAt);
|
||||||
|
}
|
||||||
|
|
||||||
// Using this to abstract nodes of skinned and non-skinned meshes
|
// Using this to abstract nodes of skinned and non-skinned meshes
|
||||||
CVector GetNodePosition(int32 node)
|
CVector GetNodePosition(int32 node)
|
||||||
{
|
{
|
||||||
@ -891,13 +898,13 @@ public:
|
|||||||
RpHAnimHierarchy *hier = GetAnimHierarchyFromSkinClump(GetClump());
|
RpHAnimHierarchy *hier = GetAnimHierarchyFromSkinClump(GetClump());
|
||||||
int32 idx = RpHAnimIDGetIndex(hier, m_pFrames[node]->nodeID);
|
int32 idx = RpHAnimIDGetIndex(hier, m_pFrames[node]->nodeID);
|
||||||
RwMatrix *mats = RpHAnimHierarchyGetMatrixArray(hier);
|
RwMatrix *mats = RpHAnimHierarchyGetMatrixArray(hier);
|
||||||
RwV3dTransformPoints((RwV3d*)&pos, (RwV3d*)&pos, 1, &mats[idx]);
|
RwV3dTransformPoints(&pos, &pos, 1, &mats[idx]);
|
||||||
}else
|
}else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
RwFrame *frame;
|
RwFrame *frame;
|
||||||
for (frame = m_pFrames[node]->frame; frame; frame = RwFrameGetParent(frame))
|
for (frame = m_pFrames[node]->frame; frame; frame = RwFrameGetParent(frame))
|
||||||
RwV3dTransformPoints((RwV3d*)&pos, (RwV3d*)&pos, 1, RwFrameGetMatrix(frame));
|
RwV3dTransformPoints(&pos, &pos, 1, RwFrameGetMatrix(frame));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -620,9 +620,7 @@ CPed::UpdateFromLeader(void)
|
|||||||
m_pLookTarget->RegisterReference((CEntity **) &m_pLookTarget);
|
m_pLookTarget->RegisterReference((CEntity **) &m_pLookTarget);
|
||||||
TurnBody();
|
TurnBody();
|
||||||
if (m_attackTimer < CTimer::GetTimeInMilliseconds() && !GetWeapon()->IsTypeMelee()) {
|
if (m_attackTimer < CTimer::GetTimeInMilliseconds() && !GetWeapon()->IsTypeMelee()) {
|
||||||
m_pPointGunAt = m_threatEntity;
|
SetWeaponLockOnTarget(m_threatEntity);
|
||||||
if (m_threatEntity)
|
|
||||||
m_threatEntity->RegisterReference((CEntity **) &m_pPointGunAt);
|
|
||||||
SetAttack(m_threatEntity);
|
SetAttack(m_threatEntity);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -811,10 +809,10 @@ CPed::ProcessObjective(void)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case OBJECTIVE_WAIT_IN_CAR:
|
case OBJECTIVE_WAIT_IN_CAR:
|
||||||
m_nPedState = PED_DRIVING;
|
SetPedState(PED_DRIVING);
|
||||||
break;
|
break;
|
||||||
case OBJECTIVE_WAIT_IN_CAR_THEN_GET_OUT:
|
case OBJECTIVE_WAIT_IN_CAR_THEN_GET_OUT:
|
||||||
m_nPedState = PED_DRIVING;
|
SetPedState(PED_DRIVING);
|
||||||
break;
|
break;
|
||||||
case OBJECTIVE_KILL_CHAR_ANY_MEANS:
|
case OBJECTIVE_KILL_CHAR_ANY_MEANS:
|
||||||
{
|
{
|
||||||
@ -972,9 +970,9 @@ CPed::ProcessObjective(void)
|
|||||||
}
|
}
|
||||||
CWeaponInfo *wepInfo = CWeaponInfo::GetWeaponInfo(GetWeapon()->m_eWeaponType);
|
CWeaponInfo *wepInfo = CWeaponInfo::GetWeaponInfo(GetWeapon()->m_eWeaponType);
|
||||||
float wepRange = wepInfo->m_fRange;
|
float wepRange = wepInfo->m_fRange;
|
||||||
float wepRangeAdjusted;
|
float maxDistToKeep;
|
||||||
if (GetWeapon()->m_eWeaponType != WEAPONTYPE_UNARMED) {
|
if (GetWeapon()->m_eWeaponType != WEAPONTYPE_UNARMED) {
|
||||||
wepRangeAdjusted = wepRange / 3.0f;
|
maxDistToKeep = wepRange / 3.0f;
|
||||||
} else {
|
} else {
|
||||||
if (m_nPedState == PED_FIGHT) {
|
if (m_nPedState == PED_FIGHT) {
|
||||||
if (!IsPlayer() && !(m_pedStats->m_flags & STAT_CAN_KICK))
|
if (!IsPlayer() && !(m_pedStats->m_flags & STAT_CAN_KICK))
|
||||||
@ -982,10 +980,10 @@ CPed::ProcessObjective(void)
|
|||||||
} else {
|
} else {
|
||||||
wepRange = 1.3f;
|
wepRange = 1.3f;
|
||||||
}
|
}
|
||||||
wepRangeAdjusted = wepRange;
|
maxDistToKeep = wepRange;
|
||||||
}
|
}
|
||||||
if (m_pedInObjective->m_getUpTimer > CTimer::GetTimeInMilliseconds() && wepRangeAdjusted < 2.5f) {
|
if (m_pedInObjective->m_getUpTimer > CTimer::GetTimeInMilliseconds() && maxDistToKeep < 2.5f) {
|
||||||
wepRangeAdjusted = 2.5f;
|
maxDistToKeep = 2.5f;
|
||||||
}
|
}
|
||||||
if (m_pedInObjective->IsPlayer() && m_nPedType != PEDTYPE_COP
|
if (m_pedInObjective->IsPlayer() && m_nPedType != PEDTYPE_COP
|
||||||
&& CharCreatedBy != MISSION_CHAR && FindPlayerPed()->m_pWanted->m_CurrentCops) {
|
&& CharCreatedBy != MISSION_CHAR && FindPlayerPed()->m_pWanted->m_CurrentCops) {
|
||||||
@ -1015,21 +1013,18 @@ CPed::ProcessObjective(void)
|
|||||||
// I hope so
|
// I hope so
|
||||||
CVector ourHead = GetMatrix() * CVector(0.5f, 0.0f, 0.6f);
|
CVector ourHead = GetMatrix() * CVector(0.5f, 0.0f, 0.6f);
|
||||||
CVector maxShotPos = vehOfTarget->GetPosition() - ourHead;
|
CVector maxShotPos = vehOfTarget->GetPosition() - ourHead;
|
||||||
maxShotPos.Normalise();
|
maxShotPos *= wepInfo->m_fRange / maxShotPos.Magnitude();
|
||||||
maxShotPos = maxShotPos * wepInfo->m_fRange + ourHead;
|
maxShotPos += ourHead;
|
||||||
|
|
||||||
CWorld::bIncludeDeadPeds = true;
|
|
||||||
CColPoint foundCol;
|
CColPoint foundCol;
|
||||||
CEntity *foundEnt;
|
CEntity *foundEnt;
|
||||||
CWorld::ProcessLineOfSight(ourHead, maxShotPos, foundCol, foundEnt,
|
|
||||||
true, true, true, true, false, true, false);
|
CWorld::bIncludeDeadPeds = true;
|
||||||
|
CWorld::ProcessLineOfSight(ourHead, maxShotPos, foundCol, foundEnt, true, true, true, true, false, true, false);
|
||||||
CWorld::bIncludeDeadPeds = false;
|
CWorld::bIncludeDeadPeds = false;
|
||||||
if (foundEnt == vehOfTarget) {
|
if (foundEnt == vehOfTarget) {
|
||||||
SetAttack(vehOfTarget);
|
SetAttack(vehOfTarget);
|
||||||
m_pPointGunAt = vehOfTarget;
|
SetWeaponLockOnTarget(vehOfTarget);
|
||||||
if (vehOfTarget)
|
|
||||||
vehOfTarget->RegisterReference((CEntity **) &m_pPointGunAt);
|
|
||||||
|
|
||||||
SetShootTimer(CGeneral::GetRandomNumberInRange(500, 2000));
|
SetShootTimer(CGeneral::GetRandomNumberInRange(500, 2000));
|
||||||
if (distWithTargetSc <= m_distanceToCountSeekDone) {
|
if (distWithTargetSc <= m_distanceToCountSeekDone) {
|
||||||
SetAttackTimer(CGeneral::GetRandomNumberInRange(200, 500));
|
SetAttackTimer(CGeneral::GetRandomNumberInRange(200, 500));
|
||||||
@ -1038,8 +1033,7 @@ CPed::ProcessObjective(void)
|
|||||||
SetAttackTimer(CGeneral::GetRandomNumberInRange(2000, 5000));
|
SetAttackTimer(CGeneral::GetRandomNumberInRange(2000, 5000));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} else if (m_nPedState != PED_ATTACK && !bKindaStayInSamePlace && !killPlayerInNoPoliceZone) {
|
||||||
else if (m_nPedState != PED_ATTACK && !bKindaStayInSamePlace && !killPlayerInNoPoliceZone) {
|
|
||||||
if (vehOfTarget) {
|
if (vehOfTarget) {
|
||||||
if (m_nPedType == PEDTYPE_COP || vehOfTarget->bIsBus) {
|
if (m_nPedType == PEDTYPE_COP || vehOfTarget->bIsBus) {
|
||||||
GoToNearestDoor(vehOfTarget);
|
GoToNearestDoor(vehOfTarget);
|
||||||
@ -1086,7 +1080,7 @@ CPed::ProcessObjective(void)
|
|||||||
|| distWithTargetSc > m_distanceToCountSeekDone && !CanSeeEntity(m_pedInObjective)) {
|
|| distWithTargetSc > m_distanceToCountSeekDone && !CanSeeEntity(m_pedInObjective)) {
|
||||||
|
|
||||||
if (m_pedInObjective->EnteringCar())
|
if (m_pedInObjective->EnteringCar())
|
||||||
wepRangeAdjusted = 2.0f;
|
maxDistToKeep = 2.0f;
|
||||||
|
|
||||||
if (bUsePedNodeSeek) {
|
if (bUsePedNodeSeek) {
|
||||||
CVector bestCoords(0.0f, 0.0f, 0.0f);
|
CVector bestCoords(0.0f, 0.0f, 0.0f);
|
||||||
@ -1100,7 +1094,7 @@ CPed::ProcessObjective(void)
|
|||||||
|
|
||||||
SetSeek(m_vecSeekPos, m_distanceToCountSeekDone);
|
SetSeek(m_vecSeekPos, m_distanceToCountSeekDone);
|
||||||
} else {
|
} else {
|
||||||
SetSeek(m_pedInObjective, wepRangeAdjusted);
|
SetSeek(m_pedInObjective, maxDistToKeep);
|
||||||
}
|
}
|
||||||
bCrouchWhenShooting = false;
|
bCrouchWhenShooting = false;
|
||||||
if (m_pedInObjective->m_pCurrentPhysSurface && distWithTargetSc < 5.0f) {
|
if (m_pedInObjective->m_pCurrentPhysSurface && distWithTargetSc < 5.0f) {
|
||||||
@ -1147,32 +1141,27 @@ CPed::ProcessObjective(void)
|
|||||||
CVector target;
|
CVector target;
|
||||||
CVector ourHead = GetMatrix() * CVector(0.5f, 0.0f, 0.6f);
|
CVector ourHead = GetMatrix() * CVector(0.5f, 0.0f, 0.6f);
|
||||||
if (m_pedInObjective->IsPed())
|
if (m_pedInObjective->IsPed())
|
||||||
m_pedInObjective->m_pedIK.GetComponentPosition((RwV3d*)&target, PED_MID);
|
m_pedInObjective->m_pedIK.GetComponentPosition(target, PED_MID);
|
||||||
else
|
else
|
||||||
target = m_pedInObjective->GetPosition();
|
target = m_pedInObjective->GetPosition();
|
||||||
|
|
||||||
target -= ourHead;
|
target -= ourHead;
|
||||||
target.Normalise();
|
target *= wepInfo->m_fRange / target.Magnitude();
|
||||||
target = target * wepInfo->m_fRange + ourHead;
|
target += ourHead;
|
||||||
|
|
||||||
|
CColPoint foundCol;
|
||||||
|
CEntity *foundEnt = nil;
|
||||||
|
|
||||||
CWorld::bIncludeDeadPeds = true;
|
CWorld::bIncludeDeadPeds = true;
|
||||||
CEntity *foundEnt = nil;
|
CWorld::ProcessLineOfSight(ourHead, target, foundCol, foundEnt, true, true, true, true, false, true, false);
|
||||||
CColPoint foundCol;
|
CWorld::bIncludeDeadPeds = false;
|
||||||
|
|
||||||
CWorld::ProcessLineOfSight(
|
|
||||||
ourHead, target, foundCol, foundEnt,
|
|
||||||
true, true, true, false, true, false);
|
|
||||||
CWorld::bIncludeDeadPeds = 0;
|
|
||||||
if (foundEnt == m_pedInObjective) {
|
if (foundEnt == m_pedInObjective) {
|
||||||
SetAttack(m_pedInObjective);
|
SetAttack(m_pedInObjective);
|
||||||
m_pPointGunAt = m_pedInObjective;
|
SetWeaponLockOnTarget(m_pedInObjective);
|
||||||
if (m_pedInObjective)
|
|
||||||
m_pedInObjective->RegisterReference((CEntity **) &m_pPointGunAt);
|
|
||||||
|
|
||||||
SetShootTimer(CGeneral::GetRandomNumberInRange(500.0f, 2000.0f));
|
SetShootTimer(CGeneral::GetRandomNumberInRange(500.0f, 2000.0f));
|
||||||
|
|
||||||
int time;
|
int time;
|
||||||
if (distWithTargetSc <= wepRangeAdjusted)
|
if (distWithTargetSc <= maxDistToKeep)
|
||||||
time = CGeneral::GetRandomNumberInRange(100.0f, 500.0f);
|
time = CGeneral::GetRandomNumberInRange(100.0f, 500.0f);
|
||||||
else
|
else
|
||||||
time = CGeneral::GetRandomNumberInRange(1500.0f, 3000.0f);
|
time = CGeneral::GetRandomNumberInRange(1500.0f, 3000.0f);
|
||||||
@ -1180,7 +1169,8 @@ CPed::ProcessObjective(void)
|
|||||||
SetAttackTimer(time);
|
SetAttackTimer(time);
|
||||||
bObstacleShowedUpDuringKillObjective = false;
|
bObstacleShowedUpDuringKillObjective = false;
|
||||||
|
|
||||||
} else if (foundEnt) {
|
} else {
|
||||||
|
if (foundEnt) {
|
||||||
if (foundEnt->IsPed()) {
|
if (foundEnt->IsPed()) {
|
||||||
SetAttackTimer(CGeneral::GetRandomNumberInRange(500.0f, 1000.0f));
|
SetAttackTimer(CGeneral::GetRandomNumberInRange(500.0f, 1000.0f));
|
||||||
bObstacleShowedUpDuringKillObjective = false;
|
bObstacleShowedUpDuringKillObjective = false;
|
||||||
@ -1199,6 +1189,7 @@ CPed::ProcessObjective(void)
|
|||||||
|
|
||||||
m_fleeFrom = foundEnt;
|
m_fleeFrom = foundEnt;
|
||||||
m_fleeFrom->RegisterReference((CEntity**) &m_fleeFrom);
|
m_fleeFrom->RegisterReference((CEntity**) &m_fleeFrom);
|
||||||
|
}
|
||||||
SetPointGunAt(m_pedInObjective);
|
SetPointGunAt(m_pedInObjective);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1230,17 +1221,17 @@ CPed::ProcessObjective(void)
|
|||||||
if (m_nPedType == PEDTYPE_COP) {
|
if (m_nPedType == PEDTYPE_COP) {
|
||||||
if (GetWeapon()->m_eWeaponType > WEAPONTYPE_COLT45
|
if (GetWeapon()->m_eWeaponType > WEAPONTYPE_COLT45
|
||||||
|| m_fleeFrom && m_fleeFrom->IsObject()) {
|
|| m_fleeFrom && m_fleeFrom->IsObject()) {
|
||||||
wepRangeAdjusted = 6.0f;
|
maxDistToKeep = 6.0f;
|
||||||
} else if (m_fleeFrom && m_fleeFrom->IsVehicle()) {
|
} else if (m_fleeFrom && m_fleeFrom->IsVehicle()) {
|
||||||
wepRangeAdjusted = 4.0f;
|
maxDistToKeep = 4.0f;
|
||||||
} else {
|
} else {
|
||||||
wepRangeAdjusted = 2.0f;
|
maxDistToKeep = 2.0f;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
wepRangeAdjusted = 2.0f;
|
maxDistToKeep = 2.0f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (distWithTargetSc <= wepRangeAdjusted) {
|
if (distWithTargetSc <= maxDistToKeep) {
|
||||||
SetMoveState(PEDMOVE_STILL);
|
SetMoveState(PEDMOVE_STILL);
|
||||||
bIsPointingGunAt = true;
|
bIsPointingGunAt = true;
|
||||||
if (m_nPedState != PED_AIM_GUN && !bDuckAndCover) {
|
if (m_nPedState != PED_AIM_GUN && !bDuckAndCover) {
|
||||||
@ -1251,7 +1242,7 @@ CPed::ProcessObjective(void)
|
|||||||
if (m_nPedState != PED_SEEK_ENTITY && m_nPedState != PED_SEEK_POS
|
if (m_nPedState != PED_SEEK_ENTITY && m_nPedState != PED_SEEK_POS
|
||||||
&& !bStopAndShoot && !killPlayerInNoPoliceZone && !bKindaStayInSamePlace) {
|
&& !bStopAndShoot && !killPlayerInNoPoliceZone && !bKindaStayInSamePlace) {
|
||||||
Say(SOUND_PED_ATTACK);
|
Say(SOUND_PED_ATTACK);
|
||||||
SetSeek(m_pedInObjective, wepRangeAdjusted);
|
SetSeek(m_pedInObjective, maxDistToKeep);
|
||||||
bIsRunning = true;
|
bIsRunning = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1541,21 +1532,18 @@ CPed::ProcessObjective(void)
|
|||||||
// I hope so
|
// I hope so
|
||||||
CVector ourHead = GetMatrix() * CVector(0.5f, 0.0f, 0.6f);
|
CVector ourHead = GetMatrix() * CVector(0.5f, 0.0f, 0.6f);
|
||||||
CVector maxShotPos = m_carInObjective->GetPosition() - ourHead;
|
CVector maxShotPos = m_carInObjective->GetPosition() - ourHead;
|
||||||
maxShotPos.Normalise();
|
maxShotPos *= wepInfo->m_fRange / maxShotPos.Magnitude();
|
||||||
maxShotPos = maxShotPos * wepInfo->m_fRange + ourHead;
|
maxShotPos += ourHead;
|
||||||
|
|
||||||
CWorld::bIncludeDeadPeds = true;
|
|
||||||
CColPoint foundCol;
|
CColPoint foundCol;
|
||||||
CEntity *foundEnt;
|
CEntity *foundEnt;
|
||||||
CWorld::ProcessLineOfSight(ourHead, maxShotPos, foundCol, foundEnt,
|
|
||||||
true, true, true, true, false, true, false);
|
CWorld::bIncludeDeadPeds = true;
|
||||||
|
CWorld::ProcessLineOfSight(ourHead, maxShotPos, foundCol, foundEnt, true, true, true, true, false, true, false);
|
||||||
CWorld::bIncludeDeadPeds = false;
|
CWorld::bIncludeDeadPeds = false;
|
||||||
if (foundEnt == m_carInObjective) {
|
if (foundEnt == m_carInObjective) {
|
||||||
SetAttack(m_carInObjective);
|
SetAttack(m_carInObjective);
|
||||||
m_pPointGunAt = m_carInObjective;
|
SetWeaponLockOnTarget(m_carInObjective);
|
||||||
if (m_pPointGunAt)
|
|
||||||
m_pPointGunAt->RegisterReference((CEntity **) &m_pPointGunAt);
|
|
||||||
|
|
||||||
SetShootTimer(CGeneral::GetRandomNumberInRange(500, 2000));
|
SetShootTimer(CGeneral::GetRandomNumberInRange(500, 2000));
|
||||||
if (distWithTargetSc > 10.0f && !bKindaStayInSamePlace) {
|
if (distWithTargetSc > 10.0f && !bKindaStayInSamePlace) {
|
||||||
SetAttackTimer(CGeneral::GetRandomNumberInRange(2000, 5000));
|
SetAttackTimer(CGeneral::GetRandomNumberInRange(2000, 5000));
|
||||||
@ -2629,7 +2617,7 @@ CPed::PedAnimGetInCB(CAnimBlendAssociation *animAssoc, void *arg)
|
|||||||
if (ped->IsPlayer() && ped->bGonnaKillTheCarJacker && ((CPlayerPed*)ped)->m_pArrestingCop) {
|
if (ped->IsPlayer() && ped->bGonnaKillTheCarJacker && ((CPlayerPed*)ped)->m_pArrestingCop) {
|
||||||
PedSetInCarCB(nil, ped);
|
PedSetInCarCB(nil, ped);
|
||||||
ped->m_nLastPedState = ped->m_nPedState;
|
ped->m_nLastPedState = ped->m_nPedState;
|
||||||
ped->m_nPedState = PED_ARRESTED;
|
ped->SetPedState(PED_ARRESTED);
|
||||||
ped->bGonnaKillTheCarJacker = false;
|
ped->bGonnaKillTheCarJacker = false;
|
||||||
if (veh) {
|
if (veh) {
|
||||||
veh->m_nNumGettingIn = 0;
|
veh->m_nNumGettingIn = 0;
|
||||||
@ -2990,9 +2978,15 @@ CPed::PedAnimStepOutCarCB(CAnimBlendAssociation* animAssoc, void* arg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ped->bFleeAfterExitingCar || ped->bGonnaKillTheCarJacker) {
|
if (ped->bFleeAfterExitingCar || ped->bGonnaKillTheCarJacker) {
|
||||||
// POTENTIAL BUG? Why DOOR_FRONT_LEFT instead of door variable? or vice versa?
|
#ifdef FIX_BUGS
|
||||||
|
if (!veh->IsDoorMissing(door))
|
||||||
|
((CAutomobile*)veh)->Damage.SetDoorStatus(door, DOOR_STATUS_SWINGING);
|
||||||
|
PedSetOutCarCB(nil, ped);
|
||||||
|
return;
|
||||||
|
#else
|
||||||
if (!veh->IsDoorMissing(door))
|
if (!veh->IsDoorMissing(door))
|
||||||
((CAutomobile*)veh)->Damage.SetDoorStatus(DOOR_FRONT_LEFT, DOOR_STATUS_SWINGING);
|
((CAutomobile*)veh)->Damage.SetDoorStatus(DOOR_FRONT_LEFT, DOOR_STATUS_SWINGING);
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
switch (door) {
|
switch (door) {
|
||||||
case DOOR_FRONT_LEFT:
|
case DOOR_FRONT_LEFT:
|
||||||
@ -3346,7 +3340,7 @@ CPed::SetCarJack_AllClear(CVehicle *car, uint32 doorNode, uint32 doorFlag)
|
|||||||
|
|
||||||
m_pSeekTarget = car;
|
m_pSeekTarget = car;
|
||||||
m_pSeekTarget->RegisterReference((CEntity**)&m_pSeekTarget);
|
m_pSeekTarget->RegisterReference((CEntity**)&m_pSeekTarget);
|
||||||
m_nPedState = PED_CARJACK;
|
SetPedState(PED_CARJACK);
|
||||||
car->bIsBeingCarJacked = true;
|
car->bIsBeingCarJacked = true;
|
||||||
m_pMyVehicle = (CVehicle*)m_pSeekTarget;
|
m_pMyVehicle = (CVehicle*)m_pSeekTarget;
|
||||||
m_pMyVehicle->RegisterReference((CEntity**)&m_pMyVehicle);
|
m_pMyVehicle->RegisterReference((CEntity**)&m_pMyVehicle);
|
||||||
@ -3393,7 +3387,7 @@ CPed::SetBeingDraggedFromCar(CVehicle *veh, uint32 vehEnterType, bool quickJack)
|
|||||||
SetMoveState(PEDMOVE_NONE);
|
SetMoveState(PEDMOVE_NONE);
|
||||||
LineUpPedWithCar(LINE_UP_TO_CAR_START);
|
LineUpPedWithCar(LINE_UP_TO_CAR_START);
|
||||||
m_pVehicleAnim = nil;
|
m_pVehicleAnim = nil;
|
||||||
m_nPedState = PED_DRAG_FROM_CAR;
|
SetPedState(PED_DRAG_FROM_CAR);
|
||||||
bChangedSeat = false;
|
bChangedSeat = false;
|
||||||
bWillBeQuickJacked = quickJack;
|
bWillBeQuickJacked = quickJack;
|
||||||
|
|
||||||
@ -3518,7 +3512,7 @@ CPed::SetEnterCar_AllClear(CVehicle *car, uint32 doorNode, uint32 doorFlag)
|
|||||||
m_pSeekTarget = car;
|
m_pSeekTarget = car;
|
||||||
m_pSeekTarget->RegisterReference((CEntity **) &m_pSeekTarget);
|
m_pSeekTarget->RegisterReference((CEntity **) &m_pSeekTarget);
|
||||||
m_vehEnterType = doorNode;
|
m_vehEnterType = doorNode;
|
||||||
m_nPedState = PED_ENTER_CAR;
|
SetPedState(PED_ENTER_CAR);
|
||||||
if (m_vehEnterType == CAR_DOOR_RF && m_objective == OBJECTIVE_ENTER_CAR_AS_DRIVER && car->m_vehType != VEHICLE_TYPE_BIKE) {
|
if (m_vehEnterType == CAR_DOOR_RF && m_objective == OBJECTIVE_ENTER_CAR_AS_DRIVER && car->m_vehType != VEHICLE_TYPE_BIKE) {
|
||||||
car->bIsBeingCarJacked = true;
|
car->bIsBeingCarJacked = true;
|
||||||
}
|
}
|
||||||
@ -3680,14 +3674,14 @@ void
|
|||||||
CPed::SetExitBoat(CVehicle *boat)
|
CPed::SetExitBoat(CVehicle *boat)
|
||||||
{
|
{
|
||||||
#ifndef VC_PED_PORTS
|
#ifndef VC_PED_PORTS
|
||||||
m_nPedState = PED_IDLE;
|
SetPedState(PED_IDLE);
|
||||||
CVector firstPos = GetPosition();
|
CVector firstPos = GetPosition();
|
||||||
CAnimManager::BlendAnimation(GetClump(), m_animGroup, ANIM_IDLE_STANCE, 100.0f);
|
CAnimManager::BlendAnimation(GetClump(), m_animGroup, ANIM_IDLE_STANCE, 100.0f);
|
||||||
if (boat->GetModelIndex() == MI_SPEEDER && boat->IsUpsideDown()) {
|
if (boat->GetModelIndex() == MI_SPEEDER && boat->IsUpsideDown()) {
|
||||||
m_pVehicleAnim = CAnimManager::BlendAnimation(GetClump(), ASSOCGRP_STD, ANIM_CAR_CRAWLOUT_RHS, 8.0f);
|
m_pVehicleAnim = CAnimManager::BlendAnimation(GetClump(), ASSOCGRP_STD, ANIM_CAR_CRAWLOUT_RHS, 8.0f);
|
||||||
m_pVehicleAnim->SetFinishCallback(PedSetOutCarCB, this);
|
m_pVehicleAnim->SetFinishCallback(PedSetOutCarCB, this);
|
||||||
m_vehEnterType = CAR_DOOR_RF;
|
m_vehEnterType = CAR_DOOR_RF;
|
||||||
m_nPedState = PED_EXIT_CAR;
|
SetPedState(PED_EXIT_CAR);
|
||||||
} else {
|
} else {
|
||||||
m_vehEnterType = CAR_DOOR_RF;
|
m_vehEnterType = CAR_DOOR_RF;
|
||||||
PedSetOutCarCB(nil, this);
|
PedSetOutCarCB(nil, this);
|
||||||
@ -3700,7 +3694,7 @@ CPed::SetExitBoat(CVehicle *boat)
|
|||||||
m_vecMoveSpeed = boat->m_vecMoveSpeed;
|
m_vecMoveSpeed = boat->m_vecMoveSpeed;
|
||||||
bTryingToReachDryLand = true;
|
bTryingToReachDryLand = true;
|
||||||
#else
|
#else
|
||||||
m_nPedState = PED_IDLE;
|
SetPedState(PED_IDLE);
|
||||||
CVector newPos = GetPosition();
|
CVector newPos = GetPosition();
|
||||||
RemoveInCarAnims();
|
RemoveInCarAnims();
|
||||||
CColModel* boatCol = boat->GetColModel();
|
CColModel* boatCol = boat->GetColModel();
|
||||||
@ -3927,7 +3921,7 @@ CPed::SetExitCar(CVehicle *veh, uint32 wantedDoorNode)
|
|||||||
m_pSeekTarget = veh;
|
m_pSeekTarget = veh;
|
||||||
m_pSeekTarget->RegisterReference((CEntity**) &m_pSeekTarget);
|
m_pSeekTarget->RegisterReference((CEntity**) &m_pSeekTarget);
|
||||||
m_vehEnterType = optedDoorNode;
|
m_vehEnterType = optedDoorNode;
|
||||||
m_nPedState = PED_EXIT_CAR;
|
SetPedState(PED_EXIT_CAR);
|
||||||
if (m_pVehicleAnim && m_pVehicleAnim->flags & ASSOC_PARTIAL)
|
if (m_pVehicleAnim && m_pVehicleAnim->flags & ASSOC_PARTIAL)
|
||||||
m_pVehicleAnim->blendDelta = -1000.0f;
|
m_pVehicleAnim->blendDelta = -1000.0f;
|
||||||
SetMoveState(PEDMOVE_NONE);
|
SetMoveState(PEDMOVE_NONE);
|
||||||
@ -4475,7 +4469,7 @@ CPed::PedSetDraggedOutCarPositionCB(CAnimBlendAssociation* animAssoc, void* arg)
|
|||||||
ped->bGonnaKillTheCarJacker = false;
|
ped->bGonnaKillTheCarJacker = false;
|
||||||
if (!ped->m_pedInObjective || !(CGeneral::GetRandomNumber() & 1)) {
|
if (!ped->m_pedInObjective || !(CGeneral::GetRandomNumber() & 1)) {
|
||||||
if (!driver || driver == ped || driver->IsPlayer() && CTheScripts::IsPlayerOnAMission()) {
|
if (!driver || driver == ped || driver->IsPlayer() && CTheScripts::IsPlayerOnAMission()) {
|
||||||
ped->m_nPedState = PED_NONE;
|
ped->SetPedState(PED_NONE);
|
||||||
ped->m_nLastPedState = PED_NONE;
|
ped->m_nLastPedState = PED_NONE;
|
||||||
ped->SetFlee(ped->m_pMyVehicle->GetPosition(), 4000);
|
ped->SetFlee(ped->m_pMyVehicle->GetPosition(), 4000);
|
||||||
} else {
|
} else {
|
||||||
@ -4504,7 +4498,7 @@ CPed::PedSetDraggedOutCarPositionCB(CAnimBlendAssociation* animAssoc, void* arg)
|
|||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
ped->m_nPedState = PED_NONE;
|
ped->SetPedState(PED_NONE);
|
||||||
ped->m_nLastPedState = PED_NONE;
|
ped->m_nLastPedState = PED_NONE;
|
||||||
ped->SetFindPathAndFlee(ped->m_pMyVehicle->GetPosition(), 10000);
|
ped->SetFindPathAndFlee(ped->m_pMyVehicle->GetPosition(), 10000);
|
||||||
}
|
}
|
||||||
@ -4597,7 +4591,7 @@ CPed::PedSetInTrainCB(CAnimBlendAssociation* animAssoc, void* arg)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
ped->bInVehicle = true;
|
ped->bInVehicle = true;
|
||||||
ped->m_nPedState = PED_DRIVING;
|
ped->SetPedState(PED_DRIVING);
|
||||||
ped->RestorePreviousObjective();
|
ped->RestorePreviousObjective();
|
||||||
ped->SetMoveState(PEDMOVE_STILL);
|
ped->SetMoveState(PEDMOVE_STILL);
|
||||||
veh->AddPassenger(ped);
|
veh->AddPassenger(ped);
|
||||||
@ -4618,7 +4612,7 @@ CPed::SetEnterTrain(CVehicle *train, uint32 unused)
|
|||||||
m_pMyVehicle = train;
|
m_pMyVehicle = train;
|
||||||
m_pMyVehicle->RegisterReference((CEntity **) &m_pMyVehicle);
|
m_pMyVehicle->RegisterReference((CEntity **) &m_pMyVehicle);
|
||||||
|
|
||||||
m_nPedState = PED_ENTER_TRAIN;
|
SetPedState(PED_ENTER_TRAIN);
|
||||||
m_pVehicleAnim = CAnimManager::BlendAnimation(GetClump(), ASSOCGRP_STD, ANIM_TRAIN_GETIN, 4.0f);
|
m_pVehicleAnim = CAnimManager::BlendAnimation(GetClump(), ASSOCGRP_STD, ANIM_TRAIN_GETIN, 4.0f);
|
||||||
m_pVehicleAnim->SetFinishCallback(PedSetInTrainCB, this);
|
m_pVehicleAnim->SetFinishCallback(PedSetInTrainCB, this);
|
||||||
bUsesCollision = false;
|
bUsesCollision = false;
|
||||||
@ -4692,7 +4686,7 @@ CPed::SetExitTrain(CVehicle* train)
|
|||||||
CVector exitPos;
|
CVector exitPos;
|
||||||
GetNearestTrainPedPosition(train, exitPos);
|
GetNearestTrainPedPosition(train, exitPos);
|
||||||
*/
|
*/
|
||||||
m_nPedState = PED_EXIT_TRAIN;
|
SetPedState(PED_EXIT_TRAIN);
|
||||||
m_pVehicleAnim = CAnimManager::BlendAnimation(GetClump(), ASSOCGRP_STD, ANIM_TRAIN_GETOUT, 4.0f);
|
m_pVehicleAnim = CAnimManager::BlendAnimation(GetClump(), ASSOCGRP_STD, ANIM_TRAIN_GETOUT, 4.0f);
|
||||||
m_pVehicleAnim->SetFinishCallback(PedSetOutTrainCB, this);
|
m_pVehicleAnim->SetFinishCallback(PedSetOutTrainCB, this);
|
||||||
bUsesCollision = false;
|
bUsesCollision = false;
|
||||||
@ -4718,7 +4712,7 @@ CPed::PedSetOutTrainCB(CAnimBlendAssociation *animAssoc, void *arg)
|
|||||||
ped->bUsesCollision = true;
|
ped->bUsesCollision = true;
|
||||||
ped->m_pVehicleAnim = nil;
|
ped->m_pVehicleAnim = nil;
|
||||||
ped->bInVehicle = false;
|
ped->bInVehicle = false;
|
||||||
ped->m_nPedState = PED_IDLE;
|
ped->SetPedState(PED_IDLE);
|
||||||
ped->RestorePreviousObjective();
|
ped->RestorePreviousObjective();
|
||||||
ped->SetMoveState(PEDMOVE_STILL);
|
ped->SetMoveState(PEDMOVE_STILL);
|
||||||
|
|
||||||
@ -5186,7 +5180,7 @@ CPed::SetSeekBoatPosition(CVehicle *boat)
|
|||||||
m_pMyVehicle = boat;
|
m_pMyVehicle = boat;
|
||||||
m_pMyVehicle->RegisterReference((CEntity **) &m_pMyVehicle);
|
m_pMyVehicle->RegisterReference((CEntity **) &m_pMyVehicle);
|
||||||
m_distanceToCountSeekDone = 0.5f;
|
m_distanceToCountSeekDone = 0.5f;
|
||||||
m_nPedState = PED_SEEK_IN_BOAT;
|
SetPedState(PED_SEEK_IN_BOAT);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -164,7 +164,7 @@ CPed::SetPointGunAt(CEntity *to)
|
|||||||
if (m_nPedState != PED_ATTACK)
|
if (m_nPedState != PED_ATTACK)
|
||||||
SetStoredState();
|
SetStoredState();
|
||||||
|
|
||||||
m_nPedState = PED_AIM_GUN;
|
SetPedState(PED_AIM_GUN);
|
||||||
bIsPointingGunAt = true;
|
bIsPointingGunAt = true;
|
||||||
CWeaponInfo *curWeapon = CWeaponInfo::GetWeaponInfo(GetWeapon()->m_eWeaponType);
|
CWeaponInfo *curWeapon = CWeaponInfo::GetWeaponInfo(GetWeapon()->m_eWeaponType);
|
||||||
SetMoveState(PEDMOVE_NONE);
|
SetMoveState(PEDMOVE_NONE);
|
||||||
@ -222,7 +222,7 @@ CPed::ClearPointGunAt(void)
|
|||||||
RestorePreviousState();
|
RestorePreviousState();
|
||||||
#else
|
#else
|
||||||
if (m_nPedState == PED_AIM_GUN || m_nPedState == PED_ATTACK) {
|
if (m_nPedState == PED_AIM_GUN || m_nPedState == PED_ATTACK) {
|
||||||
m_nPedState = PED_IDLE;
|
SetPedState(PED_IDLE);
|
||||||
RestorePreviousState();
|
RestorePreviousState();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -281,7 +281,7 @@ CPed::SetAttack(CEntity *victim)
|
|||||||
(m_nPedState != PED_FIGHT && m_nMoveState != PEDMOVE_NONE && m_nMoveState != PEDMOVE_STILL && !(m_pedStats->m_flags & STAT_SHOPPING_BAGS))) {
|
(m_nPedState != PED_FIGHT && m_nMoveState != PEDMOVE_NONE && m_nMoveState != PEDMOVE_STILL && !(m_pedStats->m_flags & STAT_SHOPPING_BAGS))) {
|
||||||
|
|
||||||
if (m_nPedState != PED_ATTACK) {
|
if (m_nPedState != PED_ATTACK) {
|
||||||
m_nPedState = PED_ATTACK;
|
SetPedState(PED_ATTACK);
|
||||||
bIsAttacking = false;
|
bIsAttacking = false;
|
||||||
animAssoc = CAnimManager::BlendAnimation(GetClump(), ASSOCGRP_STD, curWeapon->m_AnimToPlay, 8.0f);
|
animAssoc = CAnimManager::BlendAnimation(GetClump(), ASSOCGRP_STD, curWeapon->m_AnimToPlay, 8.0f);
|
||||||
animAssoc->SetRun();
|
animAssoc->SetRun();
|
||||||
@ -329,7 +329,7 @@ CPed::SetAttack(CEntity *victim)
|
|||||||
if (IsPlayer())
|
if (IsPlayer())
|
||||||
CPad::GetPad(0)->ResetAverageWeapon();
|
CPad::GetPad(0)->ResetAverageWeapon();
|
||||||
|
|
||||||
PointBlankNecessity pointBlankStatus;
|
uint8 pointBlankStatus;
|
||||||
if ((curWeapon->m_eWeaponFire == WEAPON_FIRE_INSTANT_HIT || GetWeapon()->m_eWeaponType == WEAPONTYPE_FLAMETHROWER)
|
if ((curWeapon->m_eWeaponFire == WEAPON_FIRE_INSTANT_HIT || GetWeapon()->m_eWeaponType == WEAPONTYPE_FLAMETHROWER)
|
||||||
&& TheCamera.PlayerWeaponMode.Mode != CCam::MODE_M16_1STPERSON
|
&& TheCamera.PlayerWeaponMode.Mode != CCam::MODE_M16_1STPERSON
|
||||||
&& TheCamera.PlayerWeaponMode.Mode != CCam::MODE_M16_1STPERSON_RUNABOUT
|
&& TheCamera.PlayerWeaponMode.Mode != CCam::MODE_M16_1STPERSON_RUNABOUT
|
||||||
@ -348,7 +348,7 @@ CPed::SetAttack(CEntity *victim)
|
|||||||
if (m_nPedState != PED_AIM_GUN)
|
if (m_nPedState != PED_AIM_GUN)
|
||||||
SetStoredState();
|
SetStoredState();
|
||||||
|
|
||||||
m_nPedState = PED_ATTACK;
|
SetPedState(PED_ATTACK);
|
||||||
SetMoveState(PEDMOVE_NONE);
|
SetMoveState(PEDMOVE_NONE);
|
||||||
if (bCrouchWhenShooting) {
|
if (bCrouchWhenShooting) {
|
||||||
animAssoc = CAnimManager::BlendAnimation(GetClump(), ASSOCGRP_STD, ANIM_RBLOCK_CSHOOT, 4.0f);
|
animAssoc = CAnimManager::BlendAnimation(GetClump(), ASSOCGRP_STD, ANIM_RBLOCK_CSHOOT, 4.0f);
|
||||||
@ -475,7 +475,7 @@ CPed::FinishedAttackCB(CAnimBlendAssociation *attackAssoc, void *arg)
|
|||||||
ped->ClearAttack();
|
ped->ClearAttack();
|
||||||
}
|
}
|
||||||
|
|
||||||
PointBlankNecessity
|
uint8
|
||||||
CPed::CheckForPointBlankPeds(CPed *pedToVerify)
|
CPed::CheckForPointBlankPeds(CPed *pedToVerify)
|
||||||
{
|
{
|
||||||
float pbDistance = 1.1f;
|
float pbDistance = 1.1f;
|
||||||
@ -786,7 +786,7 @@ CPed::StartFightAttack(uint8 buttonPressure)
|
|||||||
RestoreHeadingRate();
|
RestoreHeadingRate();
|
||||||
}
|
}
|
||||||
|
|
||||||
m_nPedState = PED_FIGHT;
|
SetPedState(PED_FIGHT);
|
||||||
m_fightButtonPressure = 0;
|
m_fightButtonPressure = 0;
|
||||||
RpAnimBlendClumpRemoveAssociations(GetClump(), ASSOC_REPEAT);
|
RpAnimBlendClumpRemoveAssociations(GetClump(), ASSOC_REPEAT);
|
||||||
CAnimBlendAssociation *animAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_WALK_START);
|
CAnimBlendAssociation *animAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_WALK_START);
|
||||||
@ -1062,7 +1062,7 @@ CPed::StartFightDefend(uint8 direction, uint8 hitLevel, uint8 unk)
|
|||||||
m_nWaitState = WAITSTATE_FALSE;
|
m_nWaitState = WAITSTATE_FALSE;
|
||||||
RestoreHeadingRate();
|
RestoreHeadingRate();
|
||||||
}
|
}
|
||||||
m_nPedState = PED_FIGHT;
|
SetPedState(PED_FIGHT);
|
||||||
m_fightButtonPressure = 0;
|
m_fightButtonPressure = 0;
|
||||||
RpAnimBlendClumpRemoveAssociations(GetClump(), ASSOC_REPEAT);
|
RpAnimBlendClumpRemoveAssociations(GetClump(), ASSOC_REPEAT);
|
||||||
CAnimBlendAssociation *walkStartAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_WALK_START);
|
CAnimBlendAssociation *walkStartAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_WALK_START);
|
||||||
@ -1690,7 +1690,7 @@ CPed::FightStrike(CVector &touchedNodePos)
|
|||||||
if (m_fightState == FIGHTSTATE_NO_MOVE)
|
if (m_fightState == FIGHTSTATE_NO_MOVE)
|
||||||
m_fightState = FIGHTSTATE_1;
|
m_fightState = FIGHTSTATE_1;
|
||||||
|
|
||||||
m_vecHitLastPos = *touchedNodePos;
|
m_vecHitLastPos = touchedNodePos;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1796,7 +1796,7 @@ CPed::SetInvestigateEvent(eEventType event, CVector2D pos, float distanceToCount
|
|||||||
|
|
||||||
SetStoredState();
|
SetStoredState();
|
||||||
bFindNewNodeAfterStateRestore = false;
|
bFindNewNodeAfterStateRestore = false;
|
||||||
m_nPedState = PED_INVESTIGATE;
|
SetPedState(PED_INVESTIGATE);
|
||||||
m_standardTimer = CTimer::GetTimeInMilliseconds() + time;
|
m_standardTimer = CTimer::GetTimeInMilliseconds() + time;
|
||||||
m_eventType = event;
|
m_eventType = event;
|
||||||
m_eventOrThreat = pos;
|
m_eventOrThreat = pos;
|
||||||
|
@ -137,28 +137,28 @@ CPedIK::RotateTorso(AnimBlendFrameData *node, LimbOrientation *limb, bool change
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
CPedIK::GetComponentPosition(RwV3d *pos, uint32 node)
|
CPedIK::GetComponentPosition(RwV3d &pos, uint32 node)
|
||||||
{
|
{
|
||||||
RwFrame *f;
|
RwFrame *f;
|
||||||
RwMatrix *mat;
|
RwMatrix *mat;
|
||||||
|
|
||||||
#ifdef PED_SKIN
|
#ifdef PED_SKIN
|
||||||
if(IsClumpSkinned(m_ped->GetClump())){
|
if(IsClumpSkinned(m_ped->GetClump())){
|
||||||
pos->x = 0.0f;
|
pos.x = 0.0f;
|
||||||
pos->y = 0.0f;
|
pos.y = 0.0f;
|
||||||
pos->z = 0.0f;
|
pos.z = 0.0f;
|
||||||
mat = GetComponentMatrix(m_ped, node);
|
mat = GetComponentMatrix(m_ped, node);
|
||||||
// could just copy the position out of the matrix...
|
// could just copy the position out of the matrix...
|
||||||
RwV3dTransformPoints(pos, pos, 1, mat);
|
RwV3dTransformPoints(&pos, &pos, 1, mat);
|
||||||
}else
|
}else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
f = m_ped->m_pFrames[node]->frame;
|
f = m_ped->m_pFrames[node]->frame;
|
||||||
mat = RwFrameGetMatrix(f);
|
mat = RwFrameGetMatrix(f);
|
||||||
*pos = mat->pos;
|
pos = mat->pos;
|
||||||
|
|
||||||
for (f = RwFrameGetParent(f); f; f = RwFrameGetParent(f))
|
for (f = RwFrameGetParent(f); f; f = RwFrameGetParent(f))
|
||||||
RwV3dTransformPoints(pos, pos, 1, RwFrameGetMatrix(f));
|
RwV3dTransformPoints(&pos, &pos, 1, RwFrameGetMatrix(f));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,7 +51,7 @@ public:
|
|||||||
bool PointGunInDirection(float targetYaw, float targetPitch);
|
bool PointGunInDirection(float targetYaw, float targetPitch);
|
||||||
bool PointGunInDirectionUsingArm(float targetYaw, float targetPitch);
|
bool PointGunInDirectionUsingArm(float targetYaw, float targetPitch);
|
||||||
bool PointGunAtPosition(CVector const& position);
|
bool PointGunAtPosition(CVector const& position);
|
||||||
void GetComponentPosition(RwV3d *pos, uint32 node);
|
void GetComponentPosition(RwV3d &pos, uint32 node);
|
||||||
static RwMatrix *GetWorldMatrix(RwFrame *source, RwMatrix *destination);
|
static RwMatrix *GetWorldMatrix(RwFrame *source, RwMatrix *destination);
|
||||||
void RotateTorso(AnimBlendFrameData* animBlend, LimbOrientation* limb, bool changeRoll);
|
void RotateTorso(AnimBlendFrameData* animBlend, LimbOrientation* limb, bool changeRoll);
|
||||||
void ExtractYawAndPitchLocal(RwMatrix *mat, float *yaw, float *pitch);
|
void ExtractYawAndPitchLocal(RwMatrix *mat, float *yaw, float *pitch);
|
||||||
|
@ -47,8 +47,8 @@ CPlayerPed::CPlayerPed(void) : CPed(PEDTYPE_PLAYER1)
|
|||||||
m_nSelectedWepSlot = WEAPONTYPE_UNARMED;
|
m_nSelectedWepSlot = WEAPONTYPE_UNARMED;
|
||||||
m_nSpeedTimer = 0;
|
m_nSpeedTimer = 0;
|
||||||
m_bSpeedTimerFlag = false;
|
m_bSpeedTimerFlag = false;
|
||||||
m_pPointGunAt = nil;
|
SetWeaponLockOnTarget(nil);
|
||||||
m_nPedState = PED_IDLE;
|
SetPedState(PED_IDLE);
|
||||||
#ifndef FIX_BUGS
|
#ifndef FIX_BUGS
|
||||||
m_fCurrentStamina = m_fMaxStamina = 150.0f;
|
m_fCurrentStamina = m_fMaxStamina = 150.0f;
|
||||||
#endif
|
#endif
|
||||||
@ -73,7 +73,7 @@ CPlayerPed::CPlayerPed(void) : CPed(PEDTYPE_PLAYER1)
|
|||||||
void CPlayerPed::ClearWeaponTarget()
|
void CPlayerPed::ClearWeaponTarget()
|
||||||
{
|
{
|
||||||
if (m_nPedType == PEDTYPE_PLAYER1) {
|
if (m_nPedType == PEDTYPE_PLAYER1) {
|
||||||
m_pPointGunAt = nil;
|
SetWeaponLockOnTarget(nil);
|
||||||
TheCamera.ClearPlayerWeaponMode();
|
TheCamera.ClearPlayerWeaponMode();
|
||||||
CWeaponEffects::ClearCrossHair();
|
CWeaponEffects::ClearCrossHair();
|
||||||
}
|
}
|
||||||
@ -113,16 +113,12 @@ CPlayerPed::AnnoyPlayerPed(bool annoyedByPassingEntity)
|
|||||||
{
|
{
|
||||||
if (m_pedStats->m_temper < 52) {
|
if (m_pedStats->m_temper < 52) {
|
||||||
m_pedStats->m_temper++;
|
m_pedStats->m_temper++;
|
||||||
} else {
|
} else if (annoyedByPassingEntity && m_pedStats->m_temper < 55) {
|
||||||
if (annoyedByPassingEntity) {
|
|
||||||
if (m_pedStats->m_temper < 55) {
|
|
||||||
m_pedStats->m_temper++;
|
m_pedStats->m_temper++;
|
||||||
} else {
|
} else if (annoyedByPassingEntity) {
|
||||||
m_pedStats->m_temper = 46;
|
m_pedStats->m_temper = 46;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
CPlayerPed::ClearAdrenaline(void)
|
CPlayerPed::ClearAdrenaline(void)
|
||||||
@ -215,7 +211,7 @@ CPlayerPed::ReApplyMoveAnims(void)
|
|||||||
for(int i = 0; i < ARRAY_SIZE(moveAnims); i++) {
|
for(int i = 0; i < ARRAY_SIZE(moveAnims); i++) {
|
||||||
CAnimBlendAssociation *curMoveAssoc = RpAnimBlendClumpGetAssociation(GetClump(), moveAnims[i]);
|
CAnimBlendAssociation *curMoveAssoc = RpAnimBlendClumpGetAssociation(GetClump(), moveAnims[i]);
|
||||||
if (curMoveAssoc) {
|
if (curMoveAssoc) {
|
||||||
if (strcmp(CAnimManager::GetAnimAssociation(m_animGroup, moveAnims[i])->hierarchy->name, curMoveAssoc->hierarchy->name) != 0) {
|
if (CGeneral::faststrcmp(CAnimManager::GetAnimAssociation(m_animGroup, moveAnims[i])->hierarchy->name, curMoveAssoc->hierarchy->name)) {
|
||||||
CAnimBlendAssociation *newMoveAssoc = CAnimManager::AddAnimation(GetClump(), m_animGroup, moveAnims[i]);
|
CAnimBlendAssociation *newMoveAssoc = CAnimManager::AddAnimation(GetClump(), m_animGroup, moveAnims[i]);
|
||||||
newMoveAssoc->blendDelta = curMoveAssoc->blendDelta;
|
newMoveAssoc->blendDelta = curMoveAssoc->blendDelta;
|
||||||
newMoveAssoc->blendAmount = curMoveAssoc->blendAmount;
|
newMoveAssoc->blendAmount = curMoveAssoc->blendAmount;
|
||||||
@ -248,7 +244,7 @@ CPlayerPed::SetInitialState(void)
|
|||||||
if (m_pFire)
|
if (m_pFire)
|
||||||
m_pFire->Extinguish();
|
m_pFire->Extinguish();
|
||||||
RpAnimBlendClumpRemoveAllAssociations(GetClump());
|
RpAnimBlendClumpRemoveAllAssociations(GetClump());
|
||||||
m_nPedState = PED_IDLE;
|
SetPedState(PED_IDLE);
|
||||||
SetMoveState(PEDMOVE_STILL);
|
SetMoveState(PEDMOVE_STILL);
|
||||||
m_nLastPedState = PED_NONE;
|
m_nLastPedState = PED_NONE;
|
||||||
m_animGroup = ASSOCGRP_PLAYER;
|
m_animGroup = ASSOCGRP_PLAYER;
|
||||||
@ -288,7 +284,7 @@ CPlayerPed::SetRealMoveAnim(void)
|
|||||||
if (!curIdleAssoc)
|
if (!curIdleAssoc)
|
||||||
curIdleAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_FIGHT_IDLE);
|
curIdleAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_FIGHT_IDLE);
|
||||||
|
|
||||||
if ((!curRunStopAssoc || !(curRunStopAssoc->IsRunning())) && (!curRunStopRAssoc || !(curRunStopRAssoc->IsRunning()))) {
|
if (!((curRunStopAssoc && curRunStopAssoc->IsRunning()) || (curRunStopRAssoc && curRunStopRAssoc->IsRunning()))) {
|
||||||
|
|
||||||
if (curRunStopAssoc && curRunStopAssoc->blendDelta >= 0.0f || curRunStopRAssoc && curRunStopRAssoc->blendDelta >= 0.0f) {
|
if (curRunStopAssoc && curRunStopAssoc->blendDelta >= 0.0f || curRunStopRAssoc && curRunStopRAssoc->blendDelta >= 0.0f) {
|
||||||
if (curRunStopAssoc) {
|
if (curRunStopAssoc) {
|
||||||
@ -340,8 +336,8 @@ CPlayerPed::SetRealMoveAnim(void)
|
|||||||
CAnimManager::BlendAnimation(GetClump(), m_animGroup, ANIM_IDLE_STANCE, 4.0f);
|
CAnimManager::BlendAnimation(GetClump(), m_animGroup, ANIM_IDLE_STANCE, 4.0f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_nMoveState = PEDMOVE_STILL;
|
m_nMoveState = PEDMOVE_STILL;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
if (curIdleAssoc) {
|
if (curIdleAssoc) {
|
||||||
if (curWalkStartAssoc) {
|
if (curWalkStartAssoc) {
|
||||||
@ -394,6 +390,7 @@ CPlayerPed::SetRealMoveAnim(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (curSprintAssoc && (m_nMoveState != PEDMOVE_SPRINT || m_fMoveSpeed < 0.4f)) {
|
if (curSprintAssoc && (m_nMoveState != PEDMOVE_SPRINT || m_fMoveSpeed < 0.4f)) {
|
||||||
|
// Stop sprinting in various conditions
|
||||||
if (curSprintAssoc->blendAmount == 0.0f) {
|
if (curSprintAssoc->blendAmount == 0.0f) {
|
||||||
curSprintAssoc->blendDelta = -1000.0f;
|
curSprintAssoc->blendDelta = -1000.0f;
|
||||||
curSprintAssoc->flags |= ASSOC_DELETEFADEDOUT;
|
curSprintAssoc->flags |= ASSOC_DELETEFADEDOUT;
|
||||||
@ -417,8 +414,8 @@ CPlayerPed::SetRealMoveAnim(void)
|
|||||||
curRunAssoc->flags &= ~ASSOC_RUNNING;
|
curRunAssoc->flags &= ~ASSOC_RUNNING;
|
||||||
curRunAssoc->blendAmount = 0.0f;
|
curRunAssoc->blendAmount = 0.0f;
|
||||||
curRunAssoc->blendDelta = 0.0f;
|
curRunAssoc->blendDelta = 0.0f;
|
||||||
} else if (curSprintAssoc->blendDelta >= 0.0f) {
|
|
||||||
|
|
||||||
|
} else if (curSprintAssoc->blendDelta >= 0.0f) {
|
||||||
// Stop sprinting when tired
|
// Stop sprinting when tired
|
||||||
curSprintAssoc->flags |= ASSOC_DELETEFADEDOUT;
|
curSprintAssoc->flags |= ASSOC_DELETEFADEDOUT;
|
||||||
curSprintAssoc->blendDelta = -1.0f;
|
curSprintAssoc->blendDelta = -1.0f;
|
||||||
@ -428,7 +425,9 @@ CPlayerPed::SetRealMoveAnim(void)
|
|||||||
curSprintAssoc->blendDelta = -8.0f;
|
curSprintAssoc->blendDelta = -8.0f;
|
||||||
curRunAssoc->blendDelta = 8.0f;
|
curRunAssoc->blendDelta = 8.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (curWalkStartAssoc) {
|
} else if (curWalkStartAssoc) {
|
||||||
|
// Walk start and walk/run shouldn't run at the same time
|
||||||
curWalkAssoc->flags &= ~ASSOC_RUNNING;
|
curWalkAssoc->flags &= ~ASSOC_RUNNING;
|
||||||
curRunAssoc->flags &= ~ASSOC_RUNNING;
|
curRunAssoc->flags &= ~ASSOC_RUNNING;
|
||||||
curWalkAssoc->blendAmount = 0.0f;
|
curWalkAssoc->blendAmount = 0.0f;
|
||||||
@ -436,11 +435,13 @@ CPlayerPed::SetRealMoveAnim(void)
|
|||||||
|
|
||||||
} else if (m_nMoveState == PEDMOVE_SPRINT) {
|
} else if (m_nMoveState == PEDMOVE_SPRINT) {
|
||||||
if (curSprintAssoc) {
|
if (curSprintAssoc) {
|
||||||
|
// We have anim, do it
|
||||||
if (curSprintAssoc->blendDelta < 0.0f) {
|
if (curSprintAssoc->blendDelta < 0.0f) {
|
||||||
curSprintAssoc->blendDelta = 2.0f;
|
curSprintAssoc->blendDelta = 2.0f;
|
||||||
curRunAssoc->blendDelta = -2.0f;
|
curRunAssoc->blendDelta = -2.0f;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
// Transition between run-sprint
|
||||||
curWalkAssoc->blendAmount = 0.0f;
|
curWalkAssoc->blendAmount = 0.0f;
|
||||||
curRunAssoc->blendAmount = 1.0f;
|
curRunAssoc->blendAmount = 1.0f;
|
||||||
curSprintAssoc = CAnimManager::BlendAnimation(GetClump(), m_animGroup, ANIM_SPRINT, 2.0f);
|
curSprintAssoc = CAnimManager::BlendAnimation(GetClump(), m_animGroup, ANIM_SPRINT, 2.0f);
|
||||||
@ -703,14 +704,7 @@ CPlayerPed::PlayerControl1stPersonRunAround(CPad *padUsed)
|
|||||||
float padMove = CVector2D(leftRight, upDown).Magnitude();
|
float padMove = CVector2D(leftRight, upDown).Magnitude();
|
||||||
float padMoveInGameUnit = padMove / PAD_MOVE_TO_GAME_WORLD_MOVE;
|
float padMoveInGameUnit = padMove / PAD_MOVE_TO_GAME_WORLD_MOVE;
|
||||||
if (padMoveInGameUnit > 0.0f) {
|
if (padMoveInGameUnit > 0.0f) {
|
||||||
#ifdef FREE_CAM
|
|
||||||
if (!CCamera::bFreeCam)
|
|
||||||
m_fRotationDest = CGeneral::LimitRadianAngle(TheCamera.Orientation);
|
m_fRotationDest = CGeneral::LimitRadianAngle(TheCamera.Orientation);
|
||||||
else
|
|
||||||
m_fRotationDest = CGeneral::GetRadianAngleBetweenPoints(0.0f, 0.0f, -leftRight, upDown) - TheCamera.Orientation;
|
|
||||||
#else
|
|
||||||
m_fRotationDest = CGeneral::LimitRadianAngle(TheCamera.Orientation);
|
|
||||||
#endif
|
|
||||||
m_fMoveSpeed = Min(padMoveInGameUnit, 0.07f * CTimer::GetTimeStep() + m_fMoveSpeed);
|
m_fMoveSpeed = Min(padMoveInGameUnit, 0.07f * CTimer::GetTimeStep() + m_fMoveSpeed);
|
||||||
} else {
|
} else {
|
||||||
m_fMoveSpeed = 0.0f;
|
m_fMoveSpeed = 0.0f;
|
||||||
@ -718,8 +712,7 @@ CPlayerPed::PlayerControl1stPersonRunAround(CPad *padUsed)
|
|||||||
|
|
||||||
if (m_nPedState == PED_JUMP) {
|
if (m_nPedState == PED_JUMP) {
|
||||||
if (bIsInTheAir) {
|
if (bIsInTheAir) {
|
||||||
if (bUsesCollision && !bHitSteepSlope &&
|
if (bUsesCollision && !bHitSteepSlope && (!bHitSomethingLastFrame || m_vecDamageNormal.z > 0.6f)
|
||||||
(!bHitSomethingLastFrame || m_vecDamageNormal.z > 0.6f)
|
|
||||||
&& m_fDistanceTravelled < CTimer::GetTimeStep() * 0.02 && m_vecMoveSpeed.MagnitudeSqr() < 0.01f) {
|
&& m_fDistanceTravelled < CTimer::GetTimeStep() * 0.02 && m_vecMoveSpeed.MagnitudeSqr() < 0.01f) {
|
||||||
|
|
||||||
float angleSin = Sin(m_fRotationCur); // originally sin(DEGTORAD(RADTODEG(m_fRotationCur))) o_O
|
float angleSin = Sin(m_fRotationCur); // originally sin(DEGTORAD(RADTODEG(m_fRotationCur))) o_O
|
||||||
@ -730,8 +723,7 @@ CPlayerPed::PlayerControl1stPersonRunAround(CPad *padUsed)
|
|||||||
m_fMoveSpeed = 0.0f;
|
m_fMoveSpeed = 0.0f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!(CWeaponInfo::GetWeaponInfo(GetWeapon()->m_eWeaponType)->m_bHeavy)
|
if (!(CWeaponInfo::GetWeaponInfo(GetWeapon()->m_eWeaponType)->m_bHeavy) && padUsed->GetSprint()) {
|
||||||
&& padUsed->GetSprint()) {
|
|
||||||
m_nMoveState = PEDMOVE_SPRINT;
|
m_nMoveState = PEDMOVE_SPRINT;
|
||||||
}
|
}
|
||||||
if (m_nPedState != PED_FIGHT)
|
if (m_nPedState != PED_FIGHT)
|
||||||
@ -856,10 +848,9 @@ CPlayerPed::FindNextWeaponLockOnTarget(CEntity *previousTarget, bool lookToLeft)
|
|||||||
{
|
{
|
||||||
CEntity *nextTarget = nil;
|
CEntity *nextTarget = nil;
|
||||||
float weaponRange = CWeaponInfo::GetWeaponInfo(GetWeapon()->m_eWeaponType)->m_fRange;
|
float weaponRange = CWeaponInfo::GetWeaponInfo(GetWeapon()->m_eWeaponType)->m_fRange;
|
||||||
// nextTarget = nil;
|
// nextTarget = nil; // duplicate
|
||||||
float lastCloseness = -10000.0f;
|
float lastCloseness = -10000.0f;
|
||||||
// unused
|
// CGeneral::GetATanOfXY(GetForward().x, GetForward().y); // unused
|
||||||
// CGeneral::GetATanOfXY(GetForward().x, GetForward().y);
|
|
||||||
CVector distVec = previousTarget->GetPosition() - GetPosition();
|
CVector distVec = previousTarget->GetPosition() - GetPosition();
|
||||||
float referenceBeta = CGeneral::GetATanOfXY(distVec.x, distVec.y);
|
float referenceBeta = CGeneral::GetATanOfXY(distVec.x, distVec.y);
|
||||||
|
|
||||||
@ -884,9 +875,7 @@ CPlayerPed::FindNextWeaponLockOnTarget(CEntity *previousTarget, bool lookToLeft)
|
|||||||
if (!nextTarget)
|
if (!nextTarget)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
m_pPointGunAt = nextTarget;
|
SetWeaponLockOnTarget(nextTarget);
|
||||||
if (nextTarget)
|
|
||||||
nextTarget->RegisterReference((CEntity**)&m_pPointGunAt);
|
|
||||||
SetPointGunAt(nextTarget);
|
SetPointGunAt(nextTarget);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -900,14 +889,14 @@ CPlayerPed::FindWeaponLockOnTarget(void)
|
|||||||
if (m_pPointGunAt) {
|
if (m_pPointGunAt) {
|
||||||
CVector distVec = m_pPointGunAt->GetPosition() - GetPosition();
|
CVector distVec = m_pPointGunAt->GetPosition() - GetPosition();
|
||||||
if (distVec.Magnitude2D() > weaponRange) {
|
if (distVec.Magnitude2D() > weaponRange) {
|
||||||
m_pPointGunAt = nil;
|
SetWeaponLockOnTarget(nil);
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// nextTarget = nil;
|
// nextTarget = nil; // duplicate
|
||||||
float lastCloseness = -10000.0f;
|
float lastCloseness = -10000.0f;
|
||||||
float referenceBeta = CGeneral::GetATanOfXY(GetForward().x, GetForward().y);
|
float referenceBeta = CGeneral::GetATanOfXY(GetForward().x, GetForward().y);
|
||||||
for (int h = CPools::GetPedPool()->GetSize() - 1; h >= 0; h--) {
|
for (int h = CPools::GetPedPool()->GetSize() - 1; h >= 0; h--) {
|
||||||
@ -931,9 +920,7 @@ CPlayerPed::FindWeaponLockOnTarget(void)
|
|||||||
if (!nextTarget)
|
if (!nextTarget)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
m_pPointGunAt = nextTarget;
|
SetWeaponLockOnTarget(nextTarget);
|
||||||
if (nextTarget)
|
|
||||||
nextTarget->RegisterReference((CEntity**)&m_pPointGunAt);
|
|
||||||
SetPointGunAt(nextTarget);
|
SetPointGunAt(nextTarget);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -1002,7 +989,7 @@ CPlayerPed::ProcessPlayerWeapon(CPad *padUsed)
|
|||||||
GetWeapon()->m_eWeaponType == WEAPONTYPE_SNIPERRIFLE || GetWeapon()->m_eWeaponType == WEAPONTYPE_M16) {
|
GetWeapon()->m_eWeaponType == WEAPONTYPE_SNIPERRIFLE || GetWeapon()->m_eWeaponType == WEAPONTYPE_M16) {
|
||||||
if (padUsed->TargetJustDown()) {
|
if (padUsed->TargetJustDown()) {
|
||||||
SetStoredState();
|
SetStoredState();
|
||||||
m_nPedState = PED_SNIPER_MODE;
|
SetPedState(PED_SNIPER_MODE);
|
||||||
#ifdef FREE_CAM
|
#ifdef FREE_CAM
|
||||||
if (CCamera::bFreeCam && TheCamera.Cams[0].Using3rdPersonMouseCam()) {
|
if (CCamera::bFreeCam && TheCamera.Cams[0].Using3rdPersonMouseCam()) {
|
||||||
m_fRotationCur = CGeneral::LimitRadianAngle(-TheCamera.Orientation);
|
m_fRotationCur = CGeneral::LimitRadianAngle(-TheCamera.Orientation);
|
||||||
@ -1105,7 +1092,7 @@ CPlayerPed::ProcessPlayerWeapon(CPad *padUsed)
|
|||||||
m_fRotationCur += (limitedRotDest - m_fRotationCur) / 2;
|
m_fRotationCur += (limitedRotDest - m_fRotationCur) / 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (weaponInfo->m_bCanAimWithArm)
|
} else if (weaponInfo->m_bCanAimWithArm && m_nPedState != PED_ATTACK)
|
||||||
ClearPointGunAt();
|
ClearPointGunAt();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1159,7 +1146,7 @@ CPlayerPed::ProcessPlayerWeapon(CPad *padUsed)
|
|||||||
#else
|
#else
|
||||||
CVector markPos;
|
CVector markPos;
|
||||||
if (m_pPointGunAt->IsPed()) {
|
if (m_pPointGunAt->IsPed()) {
|
||||||
((CPed*)m_pPointGunAt)->m_pedIK.GetComponentPosition((RwV3d*)markPos, PED_MID);
|
((CPed*)m_pPointGunAt)->m_pedIK.GetComponentPosition(markPos, PED_MID);
|
||||||
} else {
|
} else {
|
||||||
markPos = m_pPointGunAt->GetPosition();
|
markPos = m_pPointGunAt->GetPosition();
|
||||||
}
|
}
|
||||||
@ -1212,8 +1199,7 @@ CPlayerPed::PlayerControlZelda(CPad *padUsed)
|
|||||||
|
|
||||||
if (m_nPedState == PED_JUMP) {
|
if (m_nPedState == PED_JUMP) {
|
||||||
if (bIsInTheAir) {
|
if (bIsInTheAir) {
|
||||||
if (bUsesCollision && !bHitSteepSlope &&
|
if (bUsesCollision && !bHitSteepSlope && (!bHitSomethingLastFrame || m_vecDamageNormal.z > 0.6f)
|
||||||
(!bHitSomethingLastFrame || m_vecDamageNormal.z > 0.6f)
|
|
||||||
&& m_fDistanceTravelled < CTimer::GetTimeStep() * 0.02 && m_vecMoveSpeed.MagnitudeSqr() < 0.01f) {
|
&& m_fDistanceTravelled < CTimer::GetTimeStep() * 0.02 && m_vecMoveSpeed.MagnitudeSqr() < 0.01f) {
|
||||||
|
|
||||||
float angleSin = Sin(m_fRotationCur); // originally sin(DEGTORAD(RADTODEG(m_fRotationCur))) o_O
|
float angleSin = Sin(m_fRotationCur); // originally sin(DEGTORAD(RADTODEG(m_fRotationCur))) o_O
|
||||||
@ -1225,8 +1211,7 @@ CPlayerPed::PlayerControlZelda(CPad *padUsed)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(CWeaponInfo::GetWeaponInfo(GetWeapon()->m_eWeaponType)->m_bHeavy)
|
if (!(CWeaponInfo::GetWeaponInfo(GetWeapon()->m_eWeaponType)->m_bHeavy) && padUsed->GetSprint()) {
|
||||||
&& padUsed->GetSprint()) {
|
|
||||||
m_nMoveState = PEDMOVE_SPRINT;
|
m_nMoveState = PEDMOVE_SPRINT;
|
||||||
}
|
}
|
||||||
if (m_nPedState != PED_FIGHT)
|
if (m_nPedState != PED_FIGHT)
|
||||||
@ -1291,17 +1276,17 @@ CPlayerPed::ProcessControl(void)
|
|||||||
if (m_nPedState == PED_DRIVING && m_objective != OBJECTIVE_LEAVE_CAR) {
|
if (m_nPedState == PED_DRIVING && m_objective != OBJECTIVE_LEAVE_CAR) {
|
||||||
if (m_pMyVehicle->IsCar() && ((CAutomobile*)m_pMyVehicle)->Damage.GetDoorStatus(DOOR_FRONT_LEFT) == DOOR_STATUS_SWINGING) {
|
if (m_pMyVehicle->IsCar() && ((CAutomobile*)m_pMyVehicle)->Damage.GetDoorStatus(DOOR_FRONT_LEFT) == DOOR_STATUS_SWINGING) {
|
||||||
CAnimBlendAssociation *rollDoorAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_CAR_ROLLDOOR);
|
CAnimBlendAssociation *rollDoorAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_CAR_ROLLDOOR);
|
||||||
if (!rollDoorAssoc) {
|
|
||||||
rollDoorAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_CAR_ROLLDOOR_LOW);
|
|
||||||
}
|
|
||||||
|
|
||||||
// These comparisons are wrong, they return uint16
|
|
||||||
if (m_pMyVehicle->m_nGettingOutFlags & CAR_DOOR_FLAG_LF || rollDoorAssoc || padUsed
|
|
||||||
&& (padUsed->GetAccelerate() != 0.0f || padUsed->GetSteeringLeftRight() != 0.0f
|
|
||||||
|| padUsed->GetBrake() != 0.0f)) {
|
|
||||||
|
|
||||||
|
if (m_pMyVehicle->m_nGettingOutFlags & CAR_DOOR_FLAG_LF || rollDoorAssoc || (rollDoorAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_CAR_ROLLDOOR_LOW))) {
|
||||||
if (rollDoorAssoc)
|
if (rollDoorAssoc)
|
||||||
m_pMyVehicle->ProcessOpenDoor(CAR_DOOR_LF, ANIM_CAR_ROLLDOOR, rollDoorAssoc->currentTime);
|
m_pMyVehicle->ProcessOpenDoor(CAR_DOOR_LF, ANIM_CAR_ROLLDOOR, rollDoorAssoc->currentTime);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// These comparisons are wrong, they return uint16
|
||||||
|
if (padUsed && (padUsed->GetAccelerate() != 0.0f || padUsed->GetSteeringLeftRight() != 0.0f || padUsed->GetBrake() != 0.0f)) {
|
||||||
|
if (rollDoorAssoc)
|
||||||
|
m_pMyVehicle->ProcessOpenDoor(CAR_DOOR_LF, ANIM_CAR_ROLLDOOR, rollDoorAssoc->currentTime);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
m_pMyVehicle->m_nGettingOutFlags |= CAR_DOOR_FLAG_LF;
|
m_pMyVehicle->m_nGettingOutFlags |= CAR_DOOR_FLAG_LF;
|
||||||
if (m_pMyVehicle->bLowVehicle)
|
if (m_pMyVehicle->bLowVehicle)
|
||||||
@ -1312,6 +1297,7 @@ CPlayerPed::ProcessControl(void)
|
|||||||
rollDoorAssoc->SetFinishCallback(PedAnimDoorCloseRollingCB, this);
|
rollDoorAssoc->SetFinishCallback(PedAnimDoorCloseRollingCB, this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (m_objective == OBJECTIVE_NONE)
|
if (m_objective == OBJECTIVE_NONE)
|
||||||
@ -1338,12 +1324,18 @@ CPlayerPed::ProcessControl(void)
|
|||||||
case PED_FIGHT:
|
case PED_FIGHT:
|
||||||
case PED_AIM_GUN:
|
case PED_AIM_GUN:
|
||||||
if (!RpAnimBlendClumpGetFirstAssociation(GetClump(), ASSOC_BLOCK)) {
|
if (!RpAnimBlendClumpGetFirstAssociation(GetClump(), ASSOC_BLOCK)) {
|
||||||
if (TheCamera.Cams[0].Using3rdPersonMouseCam()) {
|
if (TheCamera.Cams[0].Using3rdPersonMouseCam()
|
||||||
|
#ifdef FREE_CAM
|
||||||
|
&& !CCamera::bFreeCam
|
||||||
|
#endif
|
||||||
|
) {
|
||||||
if (padUsed)
|
if (padUsed)
|
||||||
PlayerControl1stPersonRunAround(padUsed);
|
PlayerControl1stPersonRunAround(padUsed);
|
||||||
|
|
||||||
} else if (m_nPedState == PED_FIGHT) {
|
} else if (m_nPedState == PED_FIGHT) {
|
||||||
if (padUsed)
|
if (padUsed)
|
||||||
PlayerControlFighter(padUsed);
|
PlayerControlFighter(padUsed);
|
||||||
|
|
||||||
} else if (padUsed) {
|
} else if (padUsed) {
|
||||||
PlayerControlZelda(padUsed);
|
PlayerControlZelda(padUsed);
|
||||||
}
|
}
|
||||||
@ -1351,41 +1343,6 @@ CPlayerPed::ProcessControl(void)
|
|||||||
if (IsPedInControl() && padUsed)
|
if (IsPedInControl() && padUsed)
|
||||||
ProcessPlayerWeapon(padUsed);
|
ProcessPlayerWeapon(padUsed);
|
||||||
break;
|
break;
|
||||||
case PED_LOOK_ENTITY:
|
|
||||||
case PED_LOOK_HEADING:
|
|
||||||
case PED_WANDER_RANGE:
|
|
||||||
case PED_WANDER_PATH:
|
|
||||||
case PED_PURSUE:
|
|
||||||
case PED_FOLLOW_PATH:
|
|
||||||
case PED_ROCKET_MODE:
|
|
||||||
case PED_DUMMY:
|
|
||||||
case PED_PAUSE:
|
|
||||||
case PED_FACE_PHONE:
|
|
||||||
case PED_MAKE_CALL:
|
|
||||||
case PED_CHAT:
|
|
||||||
case PED_MUG:
|
|
||||||
case PED_AI_CONTROL:
|
|
||||||
case PED_FOLLOW_ROUTE:
|
|
||||||
case PED_CPR:
|
|
||||||
case PED_SOLICIT:
|
|
||||||
case PED_BUY_ICECREAM:
|
|
||||||
case PED_INVESTIGATE:
|
|
||||||
case PED_STEP_AWAY:
|
|
||||||
case PED_ON_FIRE:
|
|
||||||
case PED_UNKNOWN:
|
|
||||||
case PED_STATES_NO_AI:
|
|
||||||
case PED_STAGGER:
|
|
||||||
case PED_DIVE_AWAY:
|
|
||||||
case PED_STATES_NO_ST:
|
|
||||||
case PED_ARREST_PLAYER:
|
|
||||||
case PED_DRIVING:
|
|
||||||
case PED_PASSENGER:
|
|
||||||
case PED_TAXI_PASSENGER:
|
|
||||||
case PED_OPEN_DOOR:
|
|
||||||
case PED_DIE:
|
|
||||||
case PED_DEAD:
|
|
||||||
case PED_HANDS_UP:
|
|
||||||
break;
|
|
||||||
case PED_SEEK_ENTITY:
|
case PED_SEEK_ENTITY:
|
||||||
m_vecSeekPos = m_pSeekTarget->GetPosition();
|
m_vecSeekPos = m_pSeekTarget->GetPosition();
|
||||||
|
|
||||||
@ -1415,6 +1372,7 @@ CPlayerPed::ProcessControl(void)
|
|||||||
if (FindPlayerPed()->GetWeapon()->m_eWeaponType == WEAPONTYPE_M16) {
|
if (FindPlayerPed()->GetWeapon()->m_eWeaponType == WEAPONTYPE_M16) {
|
||||||
if (padUsed)
|
if (padUsed)
|
||||||
PlayerControlM16(padUsed);
|
PlayerControlM16(padUsed);
|
||||||
|
|
||||||
} else if (padUsed) {
|
} else if (padUsed) {
|
||||||
PlayerControlSniper(padUsed);
|
PlayerControlSniper(padUsed);
|
||||||
}
|
}
|
||||||
@ -1464,6 +1422,8 @@ CPlayerPed::ProcessControl(void)
|
|||||||
if (m_nLastPedState == PED_DRAG_FROM_CAR && m_pVehicleAnim)
|
if (m_nLastPedState == PED_DRAG_FROM_CAR && m_pVehicleAnim)
|
||||||
BeingDraggedFromCar();
|
BeingDraggedFromCar();
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
if (padUsed && IsPedShootable()) {
|
if (padUsed && IsPedShootable()) {
|
||||||
ProcessWeaponSwitch(padUsed);
|
ProcessWeaponSwitch(padUsed);
|
||||||
@ -1477,20 +1437,17 @@ CPlayerPed::ProcessControl(void)
|
|||||||
m_lookTimer = 0;
|
m_lookTimer = 0;
|
||||||
float camAngle = CGeneral::LimitRadianAngle(TheCamera.Cams[TheCamera.ActiveCam].Front.Heading());
|
float camAngle = CGeneral::LimitRadianAngle(TheCamera.Cams[TheCamera.ActiveCam].Front.Heading());
|
||||||
float angleBetweenPlayerAndCam = Abs(camAngle - m_fRotationCur);
|
float angleBetweenPlayerAndCam = Abs(camAngle - m_fRotationCur);
|
||||||
if (m_nPedState != PED_ATTACK
|
if (m_nPedState != PED_ATTACK && angleBetweenPlayerAndCam > DEGTORAD(30.0f) && angleBetweenPlayerAndCam < DEGTORAD(330.0f)) {
|
||||||
&& angleBetweenPlayerAndCam > DEGTORAD(30.0f) && angleBetweenPlayerAndCam < DEGTORAD(330.0f)) {
|
|
||||||
|
|
||||||
if (angleBetweenPlayerAndCam > DEGTORAD(150.0f) && angleBetweenPlayerAndCam < DEGTORAD(210.0f)) {
|
if (angleBetweenPlayerAndCam > DEGTORAD(150.0f) && angleBetweenPlayerAndCam < DEGTORAD(210.0f)) {
|
||||||
float rightTurnAngle = CGeneral::LimitRadianAngle(m_fRotationCur - DEGTORAD(150.0f));
|
float rightTurnAngle = CGeneral::LimitRadianAngle(m_fRotationCur - DEGTORAD(150.0f));
|
||||||
float leftTurnAngle = CGeneral::LimitRadianAngle(DEGTORAD(150.0f) + m_fRotationCur);
|
float leftTurnAngle = CGeneral::LimitRadianAngle(DEGTORAD(150.0f) + m_fRotationCur);
|
||||||
if (m_fLookDirection != 999999.0f) {
|
if (m_fLookDirection == 999999.0f)
|
||||||
if (Abs(rightTurnAngle - m_fLookDirection) < Abs(leftTurnAngle - m_fLookDirection))
|
camAngle = rightTurnAngle;
|
||||||
|
else if (Abs(rightTurnAngle - m_fLookDirection) < Abs(leftTurnAngle - m_fLookDirection))
|
||||||
camAngle = rightTurnAngle;
|
camAngle = rightTurnAngle;
|
||||||
else
|
else
|
||||||
camAngle = leftTurnAngle;
|
camAngle = leftTurnAngle;
|
||||||
} else {
|
|
||||||
camAngle = rightTurnAngle;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
SetLookFlag(camAngle, true);
|
SetLookFlag(camAngle, true);
|
||||||
SetLookTimer(CTimer::GetTimeStepInMilliseconds() * 5.0f);
|
SetLookTimer(CTimer::GetTimeStepInMilliseconds() * 5.0f);
|
||||||
|
@ -718,10 +718,10 @@ CPopulation::AddToPopulation(float minDist, float maxDist, float minDistOffScree
|
|||||||
if (i != 0) {
|
if (i != 0) {
|
||||||
// Gang member
|
// Gang member
|
||||||
newPed->SetLeader(gangLeader);
|
newPed->SetLeader(gangLeader);
|
||||||
#ifndef FIX_BUGS
|
#if !defined(FIX_BUGS) && GTA_VERSION >= GTA3_PC_10
|
||||||
// seems to be a miami leftover (this code is not on PS2) but gang peds end up just being frozen
|
// seems to be a miami leftover (this code is not on PS2) but gang peds end up just being frozen
|
||||||
newPed->m_nPedState = PED_UNKNOWN;
|
newPed->SetPedState(PED_UNKNOWN);
|
||||||
gangLeader->m_nPedState = PED_UNKNOWN;
|
gangLeader->SetPedState(PED_UNKNOWN);
|
||||||
newPed->m_fRotationCur = CGeneral::GetRadianAngleBetweenPoints(
|
newPed->m_fRotationCur = CGeneral::GetRadianAngleBetweenPoints(
|
||||||
gangLeader->GetPosition().x, gangLeader->GetPosition().y,
|
gangLeader->GetPosition().x, gangLeader->GetPosition().y,
|
||||||
newPed->GetPosition().x, newPed->GetPosition().y);
|
newPed->GetPosition().x, newPed->GetPosition().y);
|
||||||
|
@ -133,7 +133,7 @@ CClouds::Render(void)
|
|||||||
CSprite::InitSpriteBuffer();
|
CSprite::InitSpriteBuffer();
|
||||||
|
|
||||||
int minute = CClock::GetHours()*60 + CClock::GetMinutes();
|
int minute = CClock::GetHours()*60 + CClock::GetMinutes();
|
||||||
RwV3d campos = *(RwV3d*)&TheCamera.GetPosition();
|
RwV3d campos = TheCamera.GetPosition();
|
||||||
|
|
||||||
// Moon
|
// Moon
|
||||||
int moonfadeout = Abs(minute - 180); // fully visible at 3AM
|
int moonfadeout = Abs(minute - 180); // fully visible at 3AM
|
||||||
|
@ -255,7 +255,7 @@ CCoronas::Render(void)
|
|||||||
|
|
||||||
CVector spriteCoors;
|
CVector spriteCoors;
|
||||||
float spritew, spriteh;
|
float spritew, spriteh;
|
||||||
if(!CSprite::CalcScreenCoors(aCoronas[i].coors, spriteCoors, &spritew, &spriteh, true)){
|
if(!CSprite::CalcScreenCoors(aCoronas[i].coors, &spriteCoors, &spritew, &spriteh, true)){
|
||||||
aCoronas[i].offScreen = true;
|
aCoronas[i].offScreen = true;
|
||||||
aCoronas[i].sightClear = false;
|
aCoronas[i].sightClear = false;
|
||||||
}else{
|
}else{
|
||||||
@ -464,7 +464,7 @@ CCoronas::RenderReflections(void)
|
|||||||
|
|
||||||
CVector spriteCoors;
|
CVector spriteCoors;
|
||||||
float spritew, spriteh;
|
float spritew, spriteh;
|
||||||
if(CSprite::CalcScreenCoors(coors, spriteCoors, &spritew, &spriteh, true)){
|
if(CSprite::CalcScreenCoors(coors, &spriteCoors, &spritew, &spriteh, true)){
|
||||||
float drawDist = 0.75f * aCoronas[i].drawDist;
|
float drawDist = 0.75f * aCoronas[i].drawDist;
|
||||||
drawDist = Min(drawDist, 55.0f);
|
drawDist = Min(drawDist, 55.0f);
|
||||||
if(spriteCoors.z < drawDist){
|
if(spriteCoors.z < drawDist){
|
||||||
@ -531,7 +531,7 @@ CCoronas::DoSunAndMoon(void)
|
|||||||
|
|
||||||
CVector spriteCoors;
|
CVector spriteCoors;
|
||||||
float spritew, spriteh;
|
float spritew, spriteh;
|
||||||
if(CSprite::CalcScreenCoors(sunCoors, spriteCoors, &spritew, &spriteh, true)){
|
if(CSprite::CalcScreenCoors(sunCoors, &spriteCoors, &spritew, &spriteh, true)){
|
||||||
SunScreenX = spriteCoors.x;
|
SunScreenX = spriteCoors.x;
|
||||||
SunScreenY = spriteCoors.y;
|
SunScreenY = spriteCoors.y;
|
||||||
}else{
|
}else{
|
||||||
|
@ -667,7 +667,7 @@ void CScrollBar::Render()
|
|||||||
// Render main coronas
|
// Render main coronas
|
||||||
if (m_MessageBar[i] & (1 << j))
|
if (m_MessageBar[i] & (1 << j))
|
||||||
{
|
{
|
||||||
if (CSprite::CalcScreenCoors(coronaCoord, screenCoord, &screenW, &screenH, true))
|
if (CSprite::CalcScreenCoors(coronaCoord, &screenCoord, &screenW, &screenH, true))
|
||||||
{
|
{
|
||||||
CSprite::RenderBufferedOneXLUSprite(
|
CSprite::RenderBufferedOneXLUSprite(
|
||||||
screenCoord.x, screenCoord.y, screenCoord.z,
|
screenCoord.x, screenCoord.y, screenCoord.z,
|
||||||
@ -679,7 +679,7 @@ void CScrollBar::Render()
|
|||||||
// Render smaller and faded coronas for a trailing effect
|
// Render smaller and faded coronas for a trailing effect
|
||||||
else if (m_MessageBar[i - 1] & (1 << j))
|
else if (m_MessageBar[i - 1] & (1 << j))
|
||||||
{
|
{
|
||||||
if (CSprite::CalcScreenCoors(coronaCoord, screenCoord, &screenW, &screenH, true))
|
if (CSprite::CalcScreenCoors(coronaCoord, &screenCoord, &screenW, &screenH, true))
|
||||||
{
|
{
|
||||||
CSprite::RenderBufferedOneXLUSprite(
|
CSprite::RenderBufferedOneXLUSprite(
|
||||||
screenCoord.x, screenCoord.y, screenCoord.z,
|
screenCoord.x, screenCoord.y, screenCoord.z,
|
||||||
@ -847,7 +847,7 @@ void CDigitalClock::Render()
|
|||||||
coronaCoord.y = m_Position.y + (8 * c + i) * m_Size.y * m_fScale / 8.0f;
|
coronaCoord.y = m_Position.y + (8 * c + i) * m_Size.y * m_fScale / 8.0f;
|
||||||
coronaCoord.z = m_Position.z + j * m_fScale / 8.0f;
|
coronaCoord.z = m_Position.z + j * m_fScale / 8.0f;
|
||||||
|
|
||||||
if (CSprite::CalcScreenCoors(coronaCoord, screenCoord, &screenW, &screenH, true))
|
if (CSprite::CalcScreenCoors(coronaCoord, &screenCoord, &screenW, &screenH, true))
|
||||||
{
|
{
|
||||||
CSprite::RenderBufferedOneXLUSprite(
|
CSprite::RenderBufferedOneXLUSprite(
|
||||||
screenCoord.x, screenCoord.y, screenCoord.z,
|
screenCoord.x, screenCoord.y, screenCoord.z,
|
||||||
|
@ -1570,7 +1570,7 @@ void CParticle::Render()
|
|||||||
float w;
|
float w;
|
||||||
float h;
|
float h;
|
||||||
|
|
||||||
if ( CSprite::CalcScreenCoors(particle->m_vecPosition, coors, &w, &h, true) )
|
if ( CSprite::CalcScreenCoors(particle->m_vecPosition, &coors, &w, &h, true) )
|
||||||
{
|
{
|
||||||
#ifdef PC_PARTICLE
|
#ifdef PC_PARTICLE
|
||||||
if ( (!particleBanned || SCREEN_WIDTH * fParticleScaleLimit >= w)
|
if ( (!particleBanned || SCREEN_WIDTH * fParticleScaleLimit >= w)
|
||||||
@ -1650,7 +1650,7 @@ void CParticle::Render()
|
|||||||
float fRotation;
|
float fRotation;
|
||||||
float fTrailLength;
|
float fTrailLength;
|
||||||
|
|
||||||
if ( CSprite::CalcScreenCoors(vecPrevPos, particle->m_vecScreenPosition, &fTrailLength, &fRotation, true) )
|
if ( CSprite::CalcScreenCoors(vecPrevPos, &particle->m_vecScreenPosition, &fTrailLength, &fRotation, true) )
|
||||||
{
|
{
|
||||||
CVector2D vecDist
|
CVector2D vecDist
|
||||||
(
|
(
|
||||||
|
@ -218,7 +218,7 @@ CPointLights::RenderFogEffect(void)
|
|||||||
// more intensity the closer to line
|
// more intensity the closer to line
|
||||||
intensity *= 1.0f - sq(Sqrt(linedistsq) / FOG_AREA_WIDTH);
|
intensity *= 1.0f - sq(Sqrt(linedistsq) / FOG_AREA_WIDTH);
|
||||||
|
|
||||||
if(CSprite::CalcScreenCoors(fogcoors, spriteCoors, &spritew, &spriteh, true)){
|
if(CSprite::CalcScreenCoors(fogcoors, &spriteCoors, &spritew, &spriteh, true)){
|
||||||
float rotation = (CTimer::GetTimeInMilliseconds()&0x1FFF) * 2*3.14f / 0x2000;
|
float rotation = (CTimer::GetTimeInMilliseconds()&0x1FFF) * 2*3.14f / 0x2000;
|
||||||
float size = FogSizes[r>>1];
|
float size = FogSizes[r>>1];
|
||||||
CSprite::RenderOneXLUSprite_Rotate_Aspect(spriteCoors.x, spriteCoors.y, spriteCoors.z,
|
CSprite::RenderOneXLUSprite_Rotate_Aspect(spriteCoors.x, spriteCoors.y, spriteCoors.z,
|
||||||
@ -267,7 +267,7 @@ CPointLights::RenderFogEffect(void)
|
|||||||
intensity *= 1.0f - sq(lightdist / FOG_AREA_RADIUS);
|
intensity *= 1.0f - sq(lightdist / FOG_AREA_RADIUS);
|
||||||
|
|
||||||
CVector fogcoors(xi, yi, point.point.z + 1.6f);
|
CVector fogcoors(xi, yi, point.point.z + 1.6f);
|
||||||
if(CSprite::CalcScreenCoors(fogcoors, spriteCoors, &spritew, &spriteh, true)){
|
if(CSprite::CalcScreenCoors(fogcoors, &spriteCoors, &spritew, &spriteh, true)){
|
||||||
float rotation = (CTimer::GetTimeInMilliseconds()&0x3FFF) * 2*3.14f / 0x4000;
|
float rotation = (CTimer::GetTimeInMilliseconds()&0x3FFF) * 2*3.14f / 0x4000;
|
||||||
float size = FogSizes[r>>1];
|
float size = FogSizes[r>>1];
|
||||||
CSprite::RenderOneXLUSprite_Rotate_Aspect(spriteCoors.x, spriteCoors.y, spriteCoors.z,
|
CSprite::RenderOneXLUSprite_Rotate_Aspect(spriteCoors.x, spriteCoors.y, spriteCoors.z,
|
||||||
|
@ -741,7 +741,7 @@ CRenderer::ScanWorld(void)
|
|||||||
vectors[CORNER_PRIO_RIGHT].x = vectors[CORNER_LOD_RIGHT].x * 0.2f;
|
vectors[CORNER_PRIO_RIGHT].x = vectors[CORNER_LOD_RIGHT].x * 0.2f;
|
||||||
vectors[CORNER_PRIO_RIGHT].y = vectors[CORNER_LOD_RIGHT].y * 0.2f;
|
vectors[CORNER_PRIO_RIGHT].y = vectors[CORNER_LOD_RIGHT].y * 0.2f;
|
||||||
vectors[CORNER_PRIO_RIGHT].z = vectors[CORNER_LOD_RIGHT].z;
|
vectors[CORNER_PRIO_RIGHT].z = vectors[CORNER_LOD_RIGHT].z;
|
||||||
RwV3dTransformPoints((RwV3d*)vectors, (RwV3d*)vectors, 9, cammatrix);
|
RwV3dTransformPoints(vectors, vectors, 9, cammatrix);
|
||||||
|
|
||||||
m_loadingPriority = false;
|
m_loadingPriority = false;
|
||||||
if(TheCamera.Cams[TheCamera.ActiveCam].Mode == CCam::MODE_TOPDOWN ||
|
if(TheCamera.Cams[TheCamera.ActiveCam].Mode == CCam::MODE_TOPDOWN ||
|
||||||
@ -881,7 +881,7 @@ CRenderer::RequestObjectsInFrustum(void)
|
|||||||
vectors[CORNER_PRIO_RIGHT].x = vectors[CORNER_LOD_RIGHT].x * 0.2f;
|
vectors[CORNER_PRIO_RIGHT].x = vectors[CORNER_LOD_RIGHT].x * 0.2f;
|
||||||
vectors[CORNER_PRIO_RIGHT].y = vectors[CORNER_LOD_RIGHT].y * 0.2f;
|
vectors[CORNER_PRIO_RIGHT].y = vectors[CORNER_LOD_RIGHT].y * 0.2f;
|
||||||
vectors[CORNER_PRIO_RIGHT].z = vectors[CORNER_LOD_RIGHT].z;
|
vectors[CORNER_PRIO_RIGHT].z = vectors[CORNER_LOD_RIGHT].z;
|
||||||
RwV3dTransformPoints((RwV3d*)vectors, (RwV3d*)vectors, 9, cammatrix);
|
RwV3dTransformPoints(vectors, vectors, 9, cammatrix);
|
||||||
|
|
||||||
if(TheCamera.Cams[TheCamera.ActiveCam].Mode == CCam::MODE_TOPDOWN ||
|
if(TheCamera.Cams[TheCamera.ActiveCam].Mode == CCam::MODE_TOPDOWN ||
|
||||||
#ifdef FIX_BUGS
|
#ifdef FIX_BUGS
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "FileMgr.h"
|
#include "FileMgr.h"
|
||||||
|
#include "FileLoader.h"
|
||||||
#include "TxdStore.h"
|
#include "TxdStore.h"
|
||||||
#include "Timer.h"
|
#include "Timer.h"
|
||||||
#include "Weather.h"
|
#include "Weather.h"
|
||||||
@ -30,8 +31,8 @@ float TEXTURE_ADDV;
|
|||||||
int32 CWaterLevel::ms_nNoOfWaterLevels;
|
int32 CWaterLevel::ms_nNoOfWaterLevels;
|
||||||
float CWaterLevel::ms_aWaterZs[48];
|
float CWaterLevel::ms_aWaterZs[48];
|
||||||
CRect CWaterLevel::ms_aWaterRects[48];
|
CRect CWaterLevel::ms_aWaterRects[48];
|
||||||
uint8 CWaterLevel::aWaterBlockList[WATER_BLOCK_SIZE][WATER_BLOCK_SIZE];
|
int8 CWaterLevel::aWaterBlockList[MAX_LARGE_SECTORS][MAX_LARGE_SECTORS];
|
||||||
uint8 CWaterLevel::aWaterFineBlockList[WATER_FINEBLOCK_SIZE][WATER_FINEBLOCK_SIZE];
|
int8 CWaterLevel::aWaterFineBlockList[MAX_SMALL_SECTORS][MAX_SMALL_SECTORS];
|
||||||
bool CWaterLevel::WavesCalculatedThisFrame;
|
bool CWaterLevel::WavesCalculatedThisFrame;
|
||||||
RpAtomic *CWaterLevel::ms_pWavyAtomic;
|
RpAtomic *CWaterLevel::ms_pWavyAtomic;
|
||||||
RpGeometry *CWaterLevel::apGeomArray[8];
|
RpGeometry *CWaterLevel::apGeomArray[8];
|
||||||
@ -53,12 +54,12 @@ const float fGreenMult = 1.0f;
|
|||||||
const float fBlueMult = 1.4f;
|
const float fBlueMult = 1.4f;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
CWaterLevel::Initialise(Const char *pWaterDat)
|
CWaterLevel::Initialise(Const char *pWaterDat)
|
||||||
{
|
{
|
||||||
ms_nNoOfWaterLevels = 0;
|
ms_nNoOfWaterLevels = 0;
|
||||||
|
|
||||||
|
#ifdef MASTER
|
||||||
int32 hFile = -1;
|
int32 hFile = -1;
|
||||||
|
|
||||||
do
|
do
|
||||||
@ -66,28 +67,166 @@ CWaterLevel::Initialise(Const char *pWaterDat)
|
|||||||
hFile = CFileMgr::OpenFile("DATA\\waterpro.dat", "rb");
|
hFile = CFileMgr::OpenFile("DATA\\waterpro.dat", "rb");
|
||||||
}
|
}
|
||||||
while ( hFile < 0 );
|
while ( hFile < 0 );
|
||||||
|
#else
|
||||||
|
int32 hFile = CFileMgr::OpenFile("DATA\\waterpro.dat", "rb");
|
||||||
|
#endif
|
||||||
|
|
||||||
if (hFile > 0)
|
if (hFile > 0)
|
||||||
{
|
|
||||||
if ( hFile >= 0 )
|
|
||||||
{
|
{
|
||||||
CFileMgr::Read(hFile, (char *)&ms_nNoOfWaterLevels, sizeof(ms_nNoOfWaterLevels));
|
CFileMgr::Read(hFile, (char *)&ms_nNoOfWaterLevels, sizeof(ms_nNoOfWaterLevels));
|
||||||
CFileMgr::Read(hFile, (char *)ms_aWaterZs, sizeof(ms_aWaterZs));
|
CFileMgr::Read(hFile, (char *)ms_aWaterZs, sizeof(ms_aWaterZs));
|
||||||
CFileMgr::Read(hFile, (char *)ms_aWaterRects, sizeof(ms_aWaterRects));
|
CFileMgr::Read(hFile, (char *)ms_aWaterRects, sizeof(ms_aWaterRects));
|
||||||
CFileMgr::Read(hFile, (char *)aWaterBlockList, sizeof(aWaterBlockList));
|
CFileMgr::Read(hFile, (char *)aWaterBlockList, sizeof(aWaterBlockList));
|
||||||
CFileMgr::Read(hFile, (char *)aWaterFineBlockList, sizeof(aWaterFineBlockList));
|
CFileMgr::Read(hFile, (char *)aWaterFineBlockList, sizeof(aWaterFineBlockList));
|
||||||
}
|
|
||||||
|
|
||||||
CFileMgr::CloseFile(hFile);
|
CFileMgr::CloseFile(hFile);
|
||||||
}
|
}
|
||||||
|
#ifndef MASTER
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("Init waterlevels\n");
|
||||||
|
|
||||||
|
CFileMgr::SetDir("");
|
||||||
|
hFile = CFileMgr::OpenFile(pWaterDat, "r");
|
||||||
|
|
||||||
|
char *line;
|
||||||
|
|
||||||
|
while ((line = CFileLoader::LoadLine(hFile)))
|
||||||
|
{
|
||||||
|
#ifdef FIX_BUGS
|
||||||
|
if (*line && *line != ';' && !strstr(line, "* ;end of file"))
|
||||||
|
#else
|
||||||
|
if (*line && *line != ';')
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
float z, l, b, r, t;
|
||||||
|
sscanf(line, "%f %f %f %f %f", &z, &l, &b, &r, &t);
|
||||||
|
AddWaterLevel(l, b, r, t, z);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CFileMgr::CloseFile(hFile);
|
||||||
|
|
||||||
|
for (int32 x = 0; x < MAX_SMALL_SECTORS; x++)
|
||||||
|
{
|
||||||
|
for (int32 y = 0; y < MAX_SMALL_SECTORS; y++)
|
||||||
|
{
|
||||||
|
aWaterFineBlockList[x][y] = NO_WATER;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// rasterize water rects read from file
|
||||||
|
for (int32 i = 0; i < ms_nNoOfWaterLevels; i++)
|
||||||
|
{
|
||||||
|
int32 l = WATER_HUGE_X(ms_aWaterRects[i].left);
|
||||||
|
int32 r = WATER_HUGE_X(ms_aWaterRects[i].right) + 1.0f;
|
||||||
|
int32 t = WATER_HUGE_Y(ms_aWaterRects[i].top);
|
||||||
|
int32 b = WATER_HUGE_Y(ms_aWaterRects[i].bottom) + 1.0f;
|
||||||
|
|
||||||
|
#ifdef FIX_BUGS
|
||||||
|
// water.dat has rects that go out of bounds
|
||||||
|
// which causes memory corruption
|
||||||
|
l = clamp(l, 0, MAX_SMALL_SECTORS - 1);
|
||||||
|
r = clamp(r, 0, MAX_SMALL_SECTORS - 1);
|
||||||
|
t = clamp(t, 0, MAX_SMALL_SECTORS - 1);
|
||||||
|
b = clamp(b, 0, MAX_SMALL_SECTORS - 1);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
for (int32 x = l; x <= r; x++)
|
||||||
|
{
|
||||||
|
for (int32 y = t; y <= b; y++)
|
||||||
|
{
|
||||||
|
aWaterFineBlockList[x][y] = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove tiles that are obscured by land
|
||||||
|
for (int32 x = 0; x < MAX_SMALL_SECTORS; x++)
|
||||||
|
{
|
||||||
|
float worldX = WATER_START_X + x * SMALL_SECTOR_SIZE;
|
||||||
|
|
||||||
|
for (int32 y = 0; y < MAX_SMALL_SECTORS; y++)
|
||||||
|
{
|
||||||
|
if (aWaterFineBlockList[x][y] >= 0)
|
||||||
|
{
|
||||||
|
float worldY = WATER_START_Y + y * SMALL_SECTOR_SIZE;
|
||||||
|
|
||||||
|
int32 i;
|
||||||
|
for (i = 0; i <= 8; i++)
|
||||||
|
{
|
||||||
|
for (int32 j = 0; j <= 8; j++)
|
||||||
|
{
|
||||||
|
CVector worldPos = CVector(worldX + i * (SMALL_SECTOR_SIZE / 8), worldY + j * (SMALL_SECTOR_SIZE / 8), ms_aWaterZs[aWaterFineBlockList[x][y]]);
|
||||||
|
|
||||||
|
if ((worldPos.x > WORLD_MIN_X && worldPos.x < WORLD_MAX_X) && (worldPos.y > WORLD_MIN_Y && worldPos.y < WORLD_MAX_Y) &&
|
||||||
|
(!WaterLevelAccordingToRectangles(worldPos.x, worldPos.y) || TestVisibilityForFineWaterBlocks(worldPos)))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// at least one point in the tile wasn't blocked, so don't remove water
|
||||||
|
i = 1000;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i < 1000)
|
||||||
|
aWaterFineBlockList[x][y] = NO_WATER;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
RemoveIsolatedWater();
|
||||||
|
|
||||||
|
// calculate coarse tiles from fine tiles
|
||||||
|
for (int32 x = 0; x < MAX_LARGE_SECTORS; x++)
|
||||||
|
{
|
||||||
|
for (int32 y = 0; y < MAX_LARGE_SECTORS; y++)
|
||||||
|
{
|
||||||
|
if (aWaterFineBlockList[x * 2][y * 2] >= 0)
|
||||||
|
{
|
||||||
|
aWaterBlockList[x][y] = aWaterFineBlockList[x * 2][y * 2];
|
||||||
|
}
|
||||||
|
else if (aWaterFineBlockList[x * 2 + 1][y * 2] >= 0)
|
||||||
|
{
|
||||||
|
aWaterBlockList[x][y] = aWaterFineBlockList[x * 2 + 1][y * 2];
|
||||||
|
}
|
||||||
|
else if (aWaterFineBlockList[x * 2][y * 2 + 1] >= 0)
|
||||||
|
{
|
||||||
|
aWaterBlockList[x][y] = aWaterFineBlockList[x * 2][y * 2 + 1];
|
||||||
|
}
|
||||||
|
else if (aWaterFineBlockList[x * 2 + 1][y * 2 + 1] >= 0)
|
||||||
|
{
|
||||||
|
aWaterBlockList[x][y] = aWaterFineBlockList[x * 2 + 1][y * 2 + 1];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
aWaterBlockList[x][y] = NO_WATER;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
hFile = CFileMgr::OpenFileForWriting("data\\waterpro.dat");
|
||||||
|
|
||||||
|
if (hFile > 0)
|
||||||
|
{
|
||||||
|
CFileMgr::Write(hFile, (char *)&ms_nNoOfWaterLevels, sizeof(ms_nNoOfWaterLevels));
|
||||||
|
CFileMgr::Write(hFile, (char *)ms_aWaterZs, sizeof(ms_aWaterZs));
|
||||||
|
CFileMgr::Write(hFile, (char *)ms_aWaterRects, sizeof(ms_aWaterRects));
|
||||||
|
CFileMgr::Write(hFile, (char *)aWaterBlockList, sizeof(aWaterBlockList));
|
||||||
|
CFileMgr::Write(hFile, (char *)aWaterFineBlockList, sizeof(aWaterFineBlockList));
|
||||||
|
|
||||||
|
CFileMgr::CloseFile(hFile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
CTxdStore::PushCurrentTxd();
|
CTxdStore::PushCurrentTxd();
|
||||||
|
|
||||||
int32 slot = CTxdStore::FindTxdSlot("particle");
|
int32 slot = CTxdStore::FindTxdSlot("particle");
|
||||||
CTxdStore::SetCurrentTxd(slot);
|
CTxdStore::SetCurrentTxd(slot);
|
||||||
|
|
||||||
if ( gpWaterTex == NULL )
|
if ( gpWaterTex == nil )
|
||||||
gpWaterTex = RwTextureRead("water_old", NULL);
|
gpWaterTex = RwTextureRead("water_old", nil);
|
||||||
gpWaterRaster = RwTextureGetRaster(gpWaterTex);
|
gpWaterRaster = RwTextureGetRaster(gpWaterTex);
|
||||||
|
|
||||||
CTxdStore::PopCurrentTxd();
|
CTxdStore::PopCurrentTxd();
|
||||||
@ -104,10 +243,10 @@ CWaterLevel::Shutdown()
|
|||||||
FreeBoatWakeArray();
|
FreeBoatWakeArray();
|
||||||
DestroyWavyAtomic();
|
DestroyWavyAtomic();
|
||||||
|
|
||||||
if ( gpWaterTex != NULL )
|
if ( gpWaterTex != nil )
|
||||||
{
|
{
|
||||||
RwTextureDestroy(gpWaterTex);
|
RwTextureDestroy(gpWaterTex);
|
||||||
gpWaterTex = NULL;
|
gpWaterTex = nil;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -129,15 +268,15 @@ CWaterLevel::CreateWavyAtomic()
|
|||||||
|rpGEOMETRYPRELIT
|
|rpGEOMETRYPRELIT
|
||||||
|rpGEOMETRYMODULATEMATERIALCOLOR);
|
|rpGEOMETRYMODULATEMATERIALCOLOR);
|
||||||
|
|
||||||
ASSERT(wavyGeometry != NULL);
|
ASSERT(wavyGeometry != nil);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
wavyMaterial = RpMaterialCreate();
|
wavyMaterial = RpMaterialCreate();
|
||||||
|
|
||||||
ASSERT(wavyMaterial != NULL);
|
ASSERT(wavyMaterial != nil);
|
||||||
ASSERT(gpWaterTex != NULL);
|
ASSERT(gpWaterTex != nil);
|
||||||
|
|
||||||
RpMaterialSetTexture(wavyMaterial, gpWaterTex);
|
RpMaterialSetTexture(wavyMaterial, gpWaterTex);
|
||||||
}
|
}
|
||||||
@ -145,7 +284,7 @@ CWaterLevel::CreateWavyAtomic()
|
|||||||
{
|
{
|
||||||
wavyTriangles = RpGeometryGetTriangles(wavyGeometry);
|
wavyTriangles = RpGeometryGetTriangles(wavyGeometry);
|
||||||
|
|
||||||
ASSERT(wavyTriangles != NULL);
|
ASSERT(wavyTriangles != nil);
|
||||||
/*
|
/*
|
||||||
[B] [C]
|
[B] [C]
|
||||||
***********
|
***********
|
||||||
@ -176,9 +315,9 @@ CWaterLevel::CreateWavyAtomic()
|
|||||||
|
|
||||||
{
|
{
|
||||||
wavyMorphTarget = RpGeometryGetMorphTarget(wavyGeometry, 0);
|
wavyMorphTarget = RpGeometryGetMorphTarget(wavyGeometry, 0);
|
||||||
ASSERT(wavyMorphTarget != NULL);
|
ASSERT(wavyMorphTarget != nil);
|
||||||
wavyVert = RpMorphTargetGetVertices(wavyMorphTarget);
|
wavyVert = RpMorphTargetGetVertices(wavyMorphTarget);
|
||||||
ASSERT(wavyVert != NULL);
|
ASSERT(wavyVert != nil);
|
||||||
|
|
||||||
for ( int32 i = 0; i < 9; i++ )
|
for ( int32 i = 0; i < 9; i++ )
|
||||||
{
|
{
|
||||||
@ -198,10 +337,10 @@ CWaterLevel::CreateWavyAtomic()
|
|||||||
|
|
||||||
{
|
{
|
||||||
wavyFrame = RwFrameCreate();
|
wavyFrame = RwFrameCreate();
|
||||||
ASSERT( wavyFrame != NULL );
|
ASSERT( wavyFrame != nil );
|
||||||
|
|
||||||
ms_pWavyAtomic = RpAtomicCreate();
|
ms_pWavyAtomic = RpAtomicCreate();
|
||||||
ASSERT( ms_pWavyAtomic != NULL );
|
ASSERT( ms_pWavyAtomic != nil );
|
||||||
|
|
||||||
RpAtomicSetGeometry(ms_pWavyAtomic, wavyGeometry, 0);
|
RpAtomicSetGeometry(ms_pWavyAtomic, wavyGeometry, 0);
|
||||||
RpAtomicSetFrame(ms_pWavyAtomic, wavyFrame);
|
RpAtomicSetFrame(ms_pWavyAtomic, wavyFrame);
|
||||||
@ -222,6 +361,170 @@ CWaterLevel::DestroyWavyAtomic()
|
|||||||
RwFrameDestroy(frame);
|
RwFrameDestroy(frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef MASTER
|
||||||
|
void
|
||||||
|
CWaterLevel::AddWaterLevel(float fXLeft, float fYBottom, float fXRight, float fYTop, float fLevel)
|
||||||
|
{
|
||||||
|
ms_aWaterRects[ms_nNoOfWaterLevels] = CRect(fXLeft, fYBottom, fXRight, fYTop);
|
||||||
|
ms_aWaterZs[ms_nNoOfWaterLevels] = fLevel;
|
||||||
|
ms_nNoOfWaterLevels++;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
CWaterLevel::WaterLevelAccordingToRectangles(float fX, float fY, float *pfOutLevel)
|
||||||
|
{
|
||||||
|
if (ms_nNoOfWaterLevels <= 0) return false;
|
||||||
|
|
||||||
|
for (int32 i = 0; i < ms_nNoOfWaterLevels; i++)
|
||||||
|
{
|
||||||
|
if (fX >= ms_aWaterRects[i].left && fX <= ms_aWaterRects[i].right
|
||||||
|
&& fY >= ms_aWaterRects[i].top && fY <= ms_aWaterRects[i].bottom)
|
||||||
|
{
|
||||||
|
if (pfOutLevel) *pfOutLevel = ms_aWaterZs[i];
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
CWaterLevel::TestVisibilityForFineWaterBlocks(const CVector &worldPos)
|
||||||
|
{
|
||||||
|
static CVector2D tab[] =
|
||||||
|
{
|
||||||
|
{ 50.0f, 50.0f },
|
||||||
|
{ -50.0f, 50.0f },
|
||||||
|
{ -50.0f, -50.0f },
|
||||||
|
{ 50.0f, -50.0f },
|
||||||
|
{ 50.0f, 0.0f },
|
||||||
|
{ -50.0f, 0.0f },
|
||||||
|
{ 0.0f, -50.0f },
|
||||||
|
{ 0.0f, 50.0f },
|
||||||
|
};
|
||||||
|
|
||||||
|
CEntity *entity;
|
||||||
|
CColPoint col;
|
||||||
|
CVector lineStart, lineEnd;
|
||||||
|
|
||||||
|
lineStart = worldPos;
|
||||||
|
|
||||||
|
if (!CWorld::ProcessVerticalLine(lineStart, lineStart.z + 100.0f, col, entity, true, false, false, false, true, false, nil))
|
||||||
|
{
|
||||||
|
lineStart.x += 0.4f;
|
||||||
|
lineStart.y += 0.4f;
|
||||||
|
|
||||||
|
if (!CWorld::ProcessVerticalLine(lineStart, lineStart.z + 100.0f, col, entity, true, false, false, false, true, false, nil))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int32 i = 0; i < ARRAY_SIZE(tab); i++)
|
||||||
|
{
|
||||||
|
lineStart = worldPos;
|
||||||
|
lineEnd = worldPos;
|
||||||
|
|
||||||
|
lineEnd.x += tab[i].x;
|
||||||
|
lineEnd.y += tab[i].y;
|
||||||
|
lineEnd.z += 100.0f;
|
||||||
|
|
||||||
|
if ((lineEnd.x > WORLD_MIN_X && lineEnd.x < WORLD_MAX_X) && (lineEnd.y > WORLD_MIN_Y && lineEnd.y < WORLD_MAX_Y))
|
||||||
|
{
|
||||||
|
if (!CWorld::ProcessLineOfSight(lineStart, lineEnd, col, entity, true, false, false, false, true, false, nil))
|
||||||
|
{
|
||||||
|
lineStart.x += 0.4f;
|
||||||
|
lineStart.y += 0.4f;
|
||||||
|
lineEnd.x += 0.4f;
|
||||||
|
lineEnd.y += 0.4f;
|
||||||
|
|
||||||
|
if (!CWorld::ProcessLineOfSight(lineStart, lineEnd, col, entity, true, false, false, false, true, false, nil))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CWaterLevel::RemoveIsolatedWater()
|
||||||
|
{
|
||||||
|
bool (*isConnected)[MAX_SMALL_SECTORS] = new bool[MAX_SMALL_SECTORS][MAX_SMALL_SECTORS];
|
||||||
|
|
||||||
|
for (int32 x = 0; x < MAX_SMALL_SECTORS; x++)
|
||||||
|
{
|
||||||
|
for (int32 y = 0; y < MAX_SMALL_SECTORS; y++)
|
||||||
|
{
|
||||||
|
isConnected[x][y] = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
isConnected[0][0] = true;
|
||||||
|
bool keepGoing;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
keepGoing = false;
|
||||||
|
|
||||||
|
for (int32 x = 0; x < MAX_SMALL_SECTORS; x++)
|
||||||
|
{
|
||||||
|
for (int32 y = 0; y < MAX_SMALL_SECTORS; y++)
|
||||||
|
{
|
||||||
|
if (aWaterFineBlockList[x][y] < 0 || isConnected[x][y])
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (x > 0 && isConnected[x - 1][y])
|
||||||
|
{
|
||||||
|
isConnected[x][y] = true;
|
||||||
|
keepGoing = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (y > 0 && isConnected[x][y - 1])
|
||||||
|
{
|
||||||
|
isConnected[x][y] = true;
|
||||||
|
keepGoing = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (x + 1 < MAX_SMALL_SECTORS && isConnected[x + 1][y])
|
||||||
|
{
|
||||||
|
isConnected[x][y] = true;
|
||||||
|
keepGoing = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (y + 1 < MAX_SMALL_SECTORS && isConnected[x][y + 1])
|
||||||
|
{
|
||||||
|
isConnected[x][y] = true;
|
||||||
|
keepGoing = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (keepGoing);
|
||||||
|
|
||||||
|
int32 numRemoved = 0;
|
||||||
|
|
||||||
|
for (int32 x = 0; x < MAX_SMALL_SECTORS; x++)
|
||||||
|
{
|
||||||
|
for (int32 y = 0; y < MAX_SMALL_SECTORS; y++)
|
||||||
|
{
|
||||||
|
if (aWaterFineBlockList[x][y] >= 0 && !isConnected[x][y] && ms_aWaterZs[aWaterFineBlockList[x][y]] == 0.0f)
|
||||||
|
{
|
||||||
|
numRemoved++;
|
||||||
|
aWaterFineBlockList[x][y] = NO_WATER;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Removed %d isolated patches of water\n", numRemoved);
|
||||||
|
|
||||||
|
delete[] isConnected;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
bool
|
bool
|
||||||
CWaterLevel::GetWaterLevel(float fX, float fY, float fZ, float *pfOutLevel, bool bDontCheckZ)
|
CWaterLevel::GetWaterLevel(float fX, float fY, float fZ, float *pfOutLevel, bool bDontCheckZ)
|
||||||
{
|
{
|
||||||
@ -231,12 +534,12 @@ CWaterLevel::GetWaterLevel(float fX, float fY, float fZ, float *pfOutLevel, bool
|
|||||||
ASSERT( x >= 0 && x < HUGE_SECTOR_SIZE );
|
ASSERT( x >= 0 && x < HUGE_SECTOR_SIZE );
|
||||||
ASSERT( y >= 0 && y < HUGE_SECTOR_SIZE );
|
ASSERT( y >= 0 && y < HUGE_SECTOR_SIZE );
|
||||||
|
|
||||||
uint8 nBlock = aWaterFineBlockList[x][y];
|
int8 nBlock = aWaterFineBlockList[x][y];
|
||||||
|
|
||||||
if ( nBlock == 128 )
|
if ( nBlock == NO_WATER )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
ASSERT( pfOutLevel != NULL );
|
ASSERT( pfOutLevel != nil );
|
||||||
*pfOutLevel = ms_aWaterZs[nBlock];
|
*pfOutLevel = ms_aWaterZs[nBlock];
|
||||||
|
|
||||||
float fAngle = (CTimer::GetTimeInMilliseconds() & 4095) * (TWOPI / 4096.0f);
|
float fAngle = (CTimer::GetTimeInMilliseconds() & 4095) * (TWOPI / 4096.0f);
|
||||||
@ -270,12 +573,12 @@ CWaterLevel::GetWaterLevelNoWaves(float fX, float fY, float fZ, float *pfOutLeve
|
|||||||
ASSERT( x >= 0 && x < HUGE_SECTOR_SIZE );
|
ASSERT( x >= 0 && x < HUGE_SECTOR_SIZE );
|
||||||
ASSERT( y >= 0 && y < HUGE_SECTOR_SIZE );
|
ASSERT( y >= 0 && y < HUGE_SECTOR_SIZE );
|
||||||
|
|
||||||
uint8 nBlock = aWaterFineBlockList[x][y];
|
int8 nBlock = aWaterFineBlockList[x][y];
|
||||||
|
|
||||||
if ( nBlock == 128 )
|
if ( nBlock == NO_WATER )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
ASSERT( pfOutLevel != NULL );
|
ASSERT( pfOutLevel != nil );
|
||||||
*pfOutLevel = ms_aWaterZs[nBlock];
|
*pfOutLevel = ms_aWaterZs[nBlock];
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -418,10 +721,10 @@ CWaterLevel::RenderWater()
|
|||||||
{
|
{
|
||||||
for ( int32 y = nStartY; y <= nEndY; y++ )
|
for ( int32 y = nStartY; y <= nEndY; y++ )
|
||||||
{
|
{
|
||||||
if ( !(aWaterBlockList[2*x+0][2*y+0] & 128)
|
if ( aWaterBlockList[2*x+0][2*y+0] >= 0
|
||||||
|| !(aWaterBlockList[2*x+1][2*y+0] & 128)
|
|| aWaterBlockList[2*x+1][2*y+0] >= 0
|
||||||
|| !(aWaterBlockList[2*x+0][2*y+1] & 128)
|
|| aWaterBlockList[2*x+0][2*y+1] >= 0
|
||||||
|| !(aWaterBlockList[2*x+1][2*y+1] & 128) )
|
|| aWaterBlockList[2*x+1][2*y+1] >= 0 )
|
||||||
{
|
{
|
||||||
float fX = WATER_FROM_HUGE_SECTOR_X(x);
|
float fX = WATER_FROM_HUGE_SECTOR_X(x);
|
||||||
float fY = WATER_FROM_HUGE_SECTOR_Y(y);
|
float fY = WATER_FROM_HUGE_SECTOR_Y(y);
|
||||||
@ -443,16 +746,16 @@ CWaterLevel::RenderWater()
|
|||||||
{
|
{
|
||||||
float fZ;
|
float fZ;
|
||||||
|
|
||||||
if ( !(aWaterBlockList[2*x+0][2*y+0] & 128) )
|
if ( aWaterBlockList[2*x+0][2*y+0] >= 0 )
|
||||||
fZ = ms_aWaterZs[ aWaterBlockList[2*x+0][2*y+0] ];
|
fZ = ms_aWaterZs[ aWaterBlockList[2*x+0][2*y+0] ];
|
||||||
|
|
||||||
if ( !(aWaterBlockList[2*x+1][2*y+0] & 128) )
|
if ( aWaterBlockList[2*x+1][2*y+0] >= 0 )
|
||||||
fZ = ms_aWaterZs[ aWaterBlockList[2*x+1][2*y+0] ];
|
fZ = ms_aWaterZs[ aWaterBlockList[2*x+1][2*y+0] ];
|
||||||
|
|
||||||
if ( !(aWaterBlockList[2*x+0][2*y+1] & 128) )
|
if ( aWaterBlockList[2*x+0][2*y+1] >= 0 )
|
||||||
fZ = ms_aWaterZs[ aWaterBlockList[2*x+0][2*y+1] ];
|
fZ = ms_aWaterZs[ aWaterBlockList[2*x+0][2*y+1] ];
|
||||||
|
|
||||||
if ( !(aWaterBlockList[2*x+1][2*y+1] & 128) )
|
if ( aWaterBlockList[2*x+1][2*y+1] >= 0 )
|
||||||
fZ = ms_aWaterZs[ aWaterBlockList[2*x+1][2*y+1] ];
|
fZ = ms_aWaterZs[ aWaterBlockList[2*x+1][2*y+1] ];
|
||||||
|
|
||||||
RenderOneFlatHugeWaterPoly(fX, fY, fZ, color);
|
RenderOneFlatHugeWaterPoly(fX, fY, fZ, color);
|
||||||
@ -463,7 +766,7 @@ CWaterLevel::RenderWater()
|
|||||||
{
|
{
|
||||||
for ( int32 y2 = 2*y; y2 <= 2*y+1; y2++ )
|
for ( int32 y2 = 2*y; y2 <= 2*y+1; y2++ )
|
||||||
{
|
{
|
||||||
if ( !(aWaterBlockList[x2][y2] & 128) )
|
if ( aWaterBlockList[x2][y2] >= 0 )
|
||||||
{
|
{
|
||||||
float fLargeX = WATER_FROM_LARGE_SECTOR_X(x2);
|
float fLargeX = WATER_FROM_LARGE_SECTOR_X(x2);
|
||||||
float fLargeY = WATER_FROM_LARGE_SECTOR_Y(y2);
|
float fLargeY = WATER_FROM_LARGE_SECTOR_Y(y2);
|
||||||
@ -498,7 +801,7 @@ CWaterLevel::RenderWater()
|
|||||||
float fZ;
|
float fZ;
|
||||||
|
|
||||||
// WS
|
// WS
|
||||||
if ( !(aWaterFineBlockList[2*x2+0][2*y2+0] & 128) )
|
if ( aWaterFineBlockList[2*x2+0][2*y2+0] >= 0 )
|
||||||
{
|
{
|
||||||
float fSmallX = fLargeX;
|
float fSmallX = fLargeX;
|
||||||
float fSmallY = fLargeY;
|
float fSmallY = fLargeY;
|
||||||
@ -519,7 +822,7 @@ CWaterLevel::RenderWater()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// SE
|
// SE
|
||||||
if ( !(aWaterFineBlockList[2*x2+1][2*y2+0] & 128) )
|
if ( aWaterFineBlockList[2*x2+1][2*y2+0] >= 0 )
|
||||||
{
|
{
|
||||||
float fSmallX = fLargeX + (LARGE_SECTOR_SIZE/2);
|
float fSmallX = fLargeX + (LARGE_SECTOR_SIZE/2);
|
||||||
float fSmallY = fLargeY;
|
float fSmallY = fLargeY;
|
||||||
@ -540,7 +843,7 @@ CWaterLevel::RenderWater()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// WN
|
// WN
|
||||||
if ( !(aWaterFineBlockList[2*x2+0][2*y2+1] & 128) )
|
if ( aWaterFineBlockList[2*x2+0][2*y2+1] >= 0 )
|
||||||
{
|
{
|
||||||
float fSmallX = fLargeX;
|
float fSmallX = fLargeX;
|
||||||
float fSmallY = fLargeY + (LARGE_SECTOR_SIZE/2);
|
float fSmallY = fLargeY + (LARGE_SECTOR_SIZE/2);
|
||||||
@ -561,7 +864,7 @@ CWaterLevel::RenderWater()
|
|||||||
}
|
}
|
||||||
|
|
||||||
//NE
|
//NE
|
||||||
if ( !(aWaterFineBlockList[2*x2+1][2*y2+1] & 128) )
|
if ( aWaterFineBlockList[2*x2+1][2*y2+1] >= 0 )
|
||||||
{
|
{
|
||||||
float fSmallX = fLargeX + (LARGE_SECTOR_SIZE/2);
|
float fSmallX = fLargeX + (LARGE_SECTOR_SIZE/2);
|
||||||
float fSmallY = fLargeY + (LARGE_SECTOR_SIZE/2);
|
float fSmallY = fLargeY + (LARGE_SECTOR_SIZE/2);
|
||||||
@ -591,7 +894,7 @@ CWaterLevel::RenderWater()
|
|||||||
}
|
}
|
||||||
} // if ( TheCamera.IsSphereVisible
|
} // if ( TheCamera.IsSphereVisible
|
||||||
} // if ( fLargeSectorDistToCamSqr < fHugeSectorMaxRenderDistSqr )
|
} // if ( fLargeSectorDistToCamSqr < fHugeSectorMaxRenderDistSqr )
|
||||||
} // if ( !(aWaterBlockList[x2][y2] & 128) )
|
} // if ( aWaterBlockList[x2][y2] >= 0 )
|
||||||
} // for ( int32 y2 = 2*y; y2 <= 2*y+1; y2++ )
|
} // for ( int32 y2 = 2*y; y2 <= 2*y+1; y2++ )
|
||||||
} // for ( int32 x2 = 2*x; x2 <= 2*x+1; x2++ )
|
} // for ( int32 x2 = 2*x; x2 <= 2*x+1; x2++ )
|
||||||
//
|
//
|
||||||
@ -948,19 +1251,19 @@ CWaterLevel::RenderOneWavySector(float fX, float fY, float fZ, RwRGBA const &col
|
|||||||
|
|
||||||
CBoat::FillBoatList();
|
CBoat::FillBoatList();
|
||||||
|
|
||||||
ASSERT( ms_pWavyAtomic != NULL );
|
ASSERT( ms_pWavyAtomic != nil );
|
||||||
|
|
||||||
RpGeometry *geometry = RpAtomicGetGeometry(ms_pWavyAtomic);
|
RpGeometry *geometry = RpAtomicGetGeometry(ms_pWavyAtomic);
|
||||||
|
|
||||||
ASSERT( geometry != NULL );
|
ASSERT( geometry != nil );
|
||||||
|
|
||||||
RwRGBA *wavyPreLights = RpGeometryGetPreLightColors(geometry);
|
RwRGBA *wavyPreLights = RpGeometryGetPreLightColors(geometry);
|
||||||
RwTexCoords *wavyTexCoords = RpGeometryGetVertexTexCoords(geometry, rwTEXTURECOORDINATEINDEX0);
|
RwTexCoords *wavyTexCoords = RpGeometryGetVertexTexCoords(geometry, rwTEXTURECOORDINATEINDEX0);
|
||||||
RwV3d *wavyVertices = RpMorphTargetGetVertices(RpGeometryGetMorphTarget(geometry, 0));
|
RwV3d *wavyVertices = RpMorphTargetGetVertices(RpGeometryGetMorphTarget(geometry, 0));
|
||||||
|
|
||||||
ASSERT( wavyPreLights != NULL );
|
ASSERT( wavyPreLights != nil );
|
||||||
ASSERT( wavyTexCoords != NULL );
|
ASSERT( wavyTexCoords != nil );
|
||||||
ASSERT( wavyVertices != NULL );
|
ASSERT( wavyVertices != nil );
|
||||||
|
|
||||||
RpGeometryLock(geometry, rpGEOMETRYLOCKVERTICES
|
RpGeometryLock(geometry, rpGEOMETRYLOCKVERTICES
|
||||||
| rpGEOMETRYLOCKPRELIGHT
|
| rpGEOMETRYLOCKPRELIGHT
|
||||||
@ -983,7 +1286,7 @@ CWaterLevel::RenderOneWavySector(float fX, float fY, float fZ, RwRGBA const &col
|
|||||||
RpGeometryUnlock(geometry);
|
RpGeometryUnlock(geometry);
|
||||||
}
|
}
|
||||||
|
|
||||||
static CBoat *apBoatList[4] = { NULL };
|
static CBoat *apBoatList[4] = { nil };
|
||||||
|
|
||||||
if ( apGeomArray[0]
|
if ( apGeomArray[0]
|
||||||
&& nGeomUsed < MAX_BOAT_WAKES
|
&& nGeomUsed < MAX_BOAT_WAKES
|
||||||
@ -997,16 +1300,16 @@ CWaterLevel::RenderOneWavySector(float fX, float fY, float fZ, RwRGBA const &col
|
|||||||
RpGeometry *wavyGeometry = RpAtomicGetGeometry(ms_pWavyAtomic);
|
RpGeometry *wavyGeometry = RpAtomicGetGeometry(ms_pWavyAtomic);
|
||||||
RpGeometry *geom = apGeomArray[nGeomUsed++];
|
RpGeometry *geom = apGeomArray[nGeomUsed++];
|
||||||
|
|
||||||
ASSERT( wavyGeometry != NULL );
|
ASSERT( wavyGeometry != nil );
|
||||||
ASSERT( geom != NULL );
|
ASSERT( geom != nil );
|
||||||
|
|
||||||
RpAtomic *atomic = RpAtomicCreate();
|
RpAtomic *atomic = RpAtomicCreate();
|
||||||
ASSERT( atomic != NULL );
|
ASSERT( atomic != nil );
|
||||||
|
|
||||||
RpAtomicSetGeometry(atomic, geom, 0);
|
RpAtomicSetGeometry(atomic, geom, 0);
|
||||||
|
|
||||||
RwFrame *frame = RwFrameCreate();
|
RwFrame *frame = RwFrameCreate();
|
||||||
ASSERT( frame != NULL );
|
ASSERT( frame != nil );
|
||||||
|
|
||||||
RwMatrixCopy(RwFrameGetMatrix(frame), RwFrameGetMatrix(RpAtomicGetFrame(ms_pWavyAtomic)));
|
RwMatrixCopy(RwFrameGetMatrix(frame), RwFrameGetMatrix(RpAtomicGetFrame(ms_pWavyAtomic)));
|
||||||
RpAtomicSetFrame(atomic, frame);
|
RpAtomicSetFrame(atomic, frame);
|
||||||
@ -1017,11 +1320,11 @@ CWaterLevel::RenderOneWavySector(float fX, float fY, float fZ, RwRGBA const &col
|
|||||||
RwV3d *geomVertices = RpMorphTargetGetVertices(RpGeometryGetMorphTarget(geom, 0));
|
RwV3d *geomVertices = RpMorphTargetGetVertices(RpGeometryGetMorphTarget(geom, 0));
|
||||||
RwV3d *wavyVertices = RpMorphTargetGetVertices(RpGeometryGetMorphTarget(wavyGeometry, 0));
|
RwV3d *wavyVertices = RpMorphTargetGetVertices(RpGeometryGetMorphTarget(wavyGeometry, 0));
|
||||||
|
|
||||||
ASSERT( geomTexCoords != NULL );
|
ASSERT( geomTexCoords != nil );
|
||||||
ASSERT( wavyTexCoord != NULL );
|
ASSERT( wavyTexCoord != nil );
|
||||||
ASSERT( geomPreLights != NULL );
|
ASSERT( geomPreLights != nil );
|
||||||
ASSERT( geomVertices != NULL );
|
ASSERT( geomVertices != nil );
|
||||||
ASSERT( wavyVertices != NULL );
|
ASSERT( wavyVertices != nil );
|
||||||
|
|
||||||
RpGeometryLock(geom, rpGEOMETRYLOCKVERTICES | rpGEOMETRYLOCKPRELIGHT | rpGEOMETRYLOCKTEXCOORDS);
|
RpGeometryLock(geom, rpGEOMETRYLOCKVERTICES | rpGEOMETRYLOCKPRELIGHT | rpGEOMETRYLOCKTEXCOORDS);
|
||||||
|
|
||||||
@ -1038,7 +1341,7 @@ CWaterLevel::RenderOneWavySector(float fX, float fY, float fZ, RwRGBA const &col
|
|||||||
|
|
||||||
for ( int32 k = 0; k < 4; k++ )
|
for ( int32 k = 0; k < 4; k++ )
|
||||||
{
|
{
|
||||||
if ( apBoatList[k] != NULL )
|
if ( apBoatList[k] != nil )
|
||||||
fDistMult += CBoat::IsVertexAffectedByWake(CVector(fVertexX, fVertexY, 0.0f), apBoatList[k]);
|
fDistMult += CBoat::IsVertexAffectedByWake(CVector(fVertexX, fVertexY, 0.0f), apBoatList[k]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1087,7 +1390,7 @@ CWaterLevel::RenderOneWavySector(float fX, float fY, float fZ, RwRGBA const &col
|
|||||||
pos.y = fY;
|
pos.y = fY;
|
||||||
pos.z = fZ;
|
pos.z = fZ;
|
||||||
|
|
||||||
ASSERT( ms_pWavyAtomic != NULL );
|
ASSERT( ms_pWavyAtomic != nil );
|
||||||
|
|
||||||
RwFrameTranslate(RpAtomicGetFrame(ms_pWavyAtomic), &pos, rwCOMBINEREPLACE);
|
RwFrameTranslate(RpAtomicGetFrame(ms_pWavyAtomic), &pos, rwCOMBINEREPLACE);
|
||||||
|
|
||||||
@ -1116,7 +1419,7 @@ CWaterLevel::CalcDistanceToWater(float fX, float fY)
|
|||||||
{
|
{
|
||||||
for ( int32 y = nStartY; y <= nEndY; y++ )
|
for ( int32 y = nStartY; y <= nEndY; y++ )
|
||||||
{
|
{
|
||||||
if ( !(aWaterFineBlockList[x][y] & 128) )
|
if ( aWaterFineBlockList[x][y] >= 0 )
|
||||||
{
|
{
|
||||||
float fSectorX = WATER_FROM_SMALL_SECTOR_X(x);
|
float fSectorX = WATER_FROM_SMALL_SECTOR_X(x);
|
||||||
float fSectorY = WATER_FROM_SMALL_SECTOR_Y(y);
|
float fSectorY = WATER_FROM_SMALL_SECTOR_Y(y);
|
||||||
@ -1142,7 +1445,7 @@ CWaterLevel::RenderAndEmptyRenderBuffer()
|
|||||||
{
|
{
|
||||||
LittleTest();
|
LittleTest();
|
||||||
|
|
||||||
if ( RwIm3DTransform(TempBufferRenderVertices, TempBufferVerticesStored, NULL, rwIM3D_VERTEXUV) )
|
if ( RwIm3DTransform(TempBufferRenderVertices, TempBufferVerticesStored, nil, rwIM3D_VERTEXUV) )
|
||||||
{
|
{
|
||||||
RwIm3DRenderIndexedPrimitive(rwPRIMTYPETRILIST, TempBufferRenderIndexList, TempBufferIndicesStored);
|
RwIm3DRenderIndexedPrimitive(rwPRIMTYPETRILIST, TempBufferRenderIndexList, TempBufferIndicesStored);
|
||||||
RwIm3DEnd();
|
RwIm3DEnd();
|
||||||
@ -1160,29 +1463,29 @@ CWaterLevel::AllocateBoatWakeArray()
|
|||||||
|
|
||||||
PUSH_MEMID(MEMID_STREAM);
|
PUSH_MEMID(MEMID_STREAM);
|
||||||
|
|
||||||
ASSERT(ms_pWavyAtomic != NULL );
|
ASSERT(ms_pWavyAtomic != nil );
|
||||||
|
|
||||||
RpGeometry *wavyGeometry = RpAtomicGetGeometry(ms_pWavyAtomic);
|
RpGeometry *wavyGeometry = RpAtomicGetGeometry(ms_pWavyAtomic);
|
||||||
ASSERT(wavyGeometry != NULL );
|
ASSERT(wavyGeometry != nil );
|
||||||
RpMorphTarget *wavyMorphTarget = RpGeometryGetMorphTarget(wavyGeometry, 0);
|
RpMorphTarget *wavyMorphTarget = RpGeometryGetMorphTarget(wavyGeometry, 0);
|
||||||
RpMaterial *wavyMaterial = RpGeometryGetMaterial(wavyGeometry, 0);
|
RpMaterial *wavyMaterial = RpGeometryGetMaterial(wavyGeometry, 0);
|
||||||
|
|
||||||
ASSERT(wavyMorphTarget != NULL );
|
ASSERT(wavyMorphTarget != nil );
|
||||||
ASSERT(wavyMaterial != NULL );
|
ASSERT(wavyMaterial != nil );
|
||||||
|
|
||||||
for ( int32 geom = 0; geom < MAX_BOAT_WAKES; geom++ )
|
for ( int32 geom = 0; geom < MAX_BOAT_WAKES; geom++ )
|
||||||
{
|
{
|
||||||
if ( apGeomArray[geom] == NULL )
|
if ( apGeomArray[geom] == nil )
|
||||||
{
|
{
|
||||||
apGeomArray[geom] = RpGeometryCreate(9*9, 8*8*2, rpGEOMETRYTRISTRIP
|
apGeomArray[geom] = RpGeometryCreate(9*9, 8*8*2, rpGEOMETRYTRISTRIP
|
||||||
| rpGEOMETRYPRELIT
|
| rpGEOMETRYPRELIT
|
||||||
| rpGEOMETRYMODULATEMATERIALCOLOR
|
| rpGEOMETRYMODULATEMATERIALCOLOR
|
||||||
| rpGEOMETRYTEXTURED);
|
| rpGEOMETRYTEXTURED);
|
||||||
ASSERT(apGeomArray[geom] != NULL);
|
ASSERT(apGeomArray[geom] != nil);
|
||||||
|
|
||||||
RpTriangle *geomTriangles = RpGeometryGetTriangles(apGeomArray[geom]);
|
RpTriangle *geomTriangles = RpGeometryGetTriangles(apGeomArray[geom]);
|
||||||
|
|
||||||
ASSERT( geomTriangles != NULL );
|
ASSERT( geomTriangles != nil );
|
||||||
|
|
||||||
for ( int32 i = 0; i < 8; i++ )
|
for ( int32 i = 0; i < 8; i++ )
|
||||||
{
|
{
|
||||||
@ -1216,8 +1519,8 @@ CWaterLevel::AllocateBoatWakeArray()
|
|||||||
RpMorphTarget *geomMorphTarget = RpGeometryGetMorphTarget(apGeomArray[geom], 0);
|
RpMorphTarget *geomMorphTarget = RpGeometryGetMorphTarget(apGeomArray[geom], 0);
|
||||||
RwV3d *geomVertices = RpMorphTargetGetVertices(geomMorphTarget);
|
RwV3d *geomVertices = RpMorphTargetGetVertices(geomMorphTarget);
|
||||||
|
|
||||||
ASSERT( geomMorphTarget != NULL );
|
ASSERT( geomMorphTarget != nil );
|
||||||
ASSERT( geomVertices != NULL );
|
ASSERT( geomVertices != nil );
|
||||||
|
|
||||||
for ( int32 i = 0; i < 9; i++ )
|
for ( int32 i = 0; i < 9; i++ )
|
||||||
{
|
{
|
||||||
@ -1242,10 +1545,10 @@ CWaterLevel::FreeBoatWakeArray()
|
|||||||
{
|
{
|
||||||
for ( int32 i = 0; i < MAX_BOAT_WAKES; i++ )
|
for ( int32 i = 0; i < MAX_BOAT_WAKES; i++ )
|
||||||
{
|
{
|
||||||
if ( apGeomArray[i] != NULL )
|
if ( apGeomArray[i] != nil )
|
||||||
{
|
{
|
||||||
RpGeometryDestroy(apGeomArray[i]);
|
RpGeometryDestroy(apGeomArray[i]);
|
||||||
apGeomArray[i] = NULL;
|
apGeomArray[i] = nil;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#define WATER_BLOCK_SIZE LARGE_SECTOR_SIZE
|
|
||||||
#define WATER_FINEBLOCK_SIZE HUGE_SECTOR_SIZE
|
|
||||||
#define WATER_Z_OFFSET (1.5f)
|
#define WATER_Z_OFFSET (1.5f)
|
||||||
|
|
||||||
|
#define NO_WATER -128
|
||||||
|
|
||||||
#define MAX_SMALL_SECTORS 128
|
#define MAX_SMALL_SECTORS 128
|
||||||
#define MAX_LARGE_SECTORS 64
|
#define MAX_LARGE_SECTORS 64
|
||||||
#define MAX_HUGE_SECTORS 32
|
#define MAX_HUGE_SECTORS 32
|
||||||
@ -23,7 +23,6 @@
|
|||||||
#define WATER_WIDTH ((WATER_END_X - WATER_START_X))
|
#define WATER_WIDTH ((WATER_END_X - WATER_START_X))
|
||||||
#define WATER_HEIGHT ((WATER_END_Y - WATER_START_Y))
|
#define WATER_HEIGHT ((WATER_END_Y - WATER_START_Y))
|
||||||
|
|
||||||
|
|
||||||
#define WATER_UNSIGN_X(x) ( (x) + (WATER_WIDTH /2) )
|
#define WATER_UNSIGN_X(x) ( (x) + (WATER_WIDTH /2) )
|
||||||
#define WATER_UNSIGN_Y(y) ( (y) + (WATER_HEIGHT/2) )
|
#define WATER_UNSIGN_Y(y) ( (y) + (WATER_HEIGHT/2) )
|
||||||
#define WATER_SIGN_X(x) ( (x) - (WATER_WIDTH /2) )
|
#define WATER_SIGN_X(x) ( (x) - (WATER_WIDTH /2) )
|
||||||
@ -72,8 +71,8 @@ class CWaterLevel
|
|||||||
static int32 ms_nNoOfWaterLevels;
|
static int32 ms_nNoOfWaterLevels;
|
||||||
static float ms_aWaterZs[48];
|
static float ms_aWaterZs[48];
|
||||||
static CRect ms_aWaterRects[48];
|
static CRect ms_aWaterRects[48];
|
||||||
static uint8 aWaterBlockList[WATER_BLOCK_SIZE][WATER_BLOCK_SIZE];
|
static int8 aWaterBlockList[MAX_LARGE_SECTORS][MAX_LARGE_SECTORS];
|
||||||
static uint8 aWaterFineBlockList[WATER_FINEBLOCK_SIZE][WATER_FINEBLOCK_SIZE];
|
static int8 aWaterFineBlockList[MAX_SMALL_SECTORS][MAX_SMALL_SECTORS];
|
||||||
static bool WavesCalculatedThisFrame;
|
static bool WavesCalculatedThisFrame;
|
||||||
static RpAtomic *ms_pWavyAtomic;
|
static RpAtomic *ms_pWavyAtomic;
|
||||||
static RpGeometry *apGeomArray[MAX_BOAT_WAKES];
|
static RpGeometry *apGeomArray[MAX_BOAT_WAKES];
|
||||||
@ -84,6 +83,10 @@ public:
|
|||||||
static void Shutdown();
|
static void Shutdown();
|
||||||
static void CreateWavyAtomic();
|
static void CreateWavyAtomic();
|
||||||
static void DestroyWavyAtomic();
|
static void DestroyWavyAtomic();
|
||||||
|
static void AddWaterLevel(float fXLeft, float fYBottom, float fXRight, float fYTop, float fLevel);
|
||||||
|
static bool WaterLevelAccordingToRectangles(float fX, float fY, float *pfOutLevel = nil);
|
||||||
|
static bool TestVisibilityForFineWaterBlocks(const CVector &worldPos);
|
||||||
|
static void RemoveIsolatedWater();
|
||||||
static bool GetWaterLevel(float fX, float fY, float fZ, float *pfOutLevel, bool bDontCheckZ);
|
static bool GetWaterLevel(float fX, float fY, float fZ, float *pfOutLevel, bool bDontCheckZ);
|
||||||
static bool GetWaterLevel(CVector coors, float *pfOutLevel, bool bDontCheckZ) { return GetWaterLevel(coors.x, coors.y, coors.z, pfOutLevel, bDontCheckZ); }
|
static bool GetWaterLevel(CVector coors, float *pfOutLevel, bool bDontCheckZ) { return GetWaterLevel(coors.x, coors.y, coors.z, pfOutLevel, bDontCheckZ); }
|
||||||
static bool GetWaterLevelNoWaves(float fX, float fY, float fZ, float *pfOutLevel);
|
static bool GetWaterLevelNoWaves(float fX, float fY, float fZ, float *pfOutLevel);
|
||||||
|
@ -359,7 +359,7 @@ void CWeather::AddRain()
|
|||||||
RwCameraGetFarClipPlane(TheCamera.m_pRwCamera) / (RwCameraGetFarClipPlane(TheCamera.m_pRwCamera) * *(CVector2D*)RwCameraGetViewWindow(TheCamera.m_pRwCamera)).Magnitude();
|
RwCameraGetFarClipPlane(TheCamera.m_pRwCamera) / (RwCameraGetFarClipPlane(TheCamera.m_pRwCamera) * *(CVector2D*)RwCameraGetViewWindow(TheCamera.m_pRwCamera)).Magnitude();
|
||||||
splash_points[3] = 4.0f * CVector(RwCameraGetViewWindow(TheCamera.m_pRwCamera)->x, RwCameraGetViewWindow(TheCamera.m_pRwCamera)->y, 1.0f) *
|
splash_points[3] = 4.0f * CVector(RwCameraGetViewWindow(TheCamera.m_pRwCamera)->x, RwCameraGetViewWindow(TheCamera.m_pRwCamera)->y, 1.0f) *
|
||||||
RwCameraGetFarClipPlane(TheCamera.m_pRwCamera) / (RwCameraGetFarClipPlane(TheCamera.m_pRwCamera) * *(CVector2D*)RwCameraGetViewWindow(TheCamera.m_pRwCamera)).Magnitude();
|
RwCameraGetFarClipPlane(TheCamera.m_pRwCamera) / (RwCameraGetFarClipPlane(TheCamera.m_pRwCamera) * *(CVector2D*)RwCameraGetViewWindow(TheCamera.m_pRwCamera)).Magnitude();
|
||||||
RwV3dTransformPoints((RwV3d*)splash_points, (RwV3d*)splash_points, 4, RwFrameGetMatrix(RwCameraGetFrame(TheCamera.m_pRwCamera)));
|
RwV3dTransformPoints(splash_points, splash_points, 4, RwFrameGetMatrix(RwCameraGetFrame(TheCamera.m_pRwCamera)));
|
||||||
CVector fp = (splash_points[0] + splash_points[1] + splash_points[2] + splash_points[3]) / 4;
|
CVector fp = (splash_points[0] + splash_points[1] + splash_points[2] + splash_points[3]) / 4;
|
||||||
for (int i = 0; i < num_splash_attempts; i++) {
|
for (int i = 0; i < num_splash_attempts; i++) {
|
||||||
CColPoint point;
|
CColPoint point;
|
||||||
|
@ -203,6 +203,10 @@ CVisibilityPlugins::InsertAtomicIntoSortedList(RpAtomic *a, float dist)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// can't increase this yet unfortunately...
|
||||||
|
// probably have to fix fading for this so material alpha isn't overwritten
|
||||||
|
#define VEHICLE_LODDIST_MULTIPLIER (TheCamera.GenerationDistMultiplier)
|
||||||
|
|
||||||
void
|
void
|
||||||
CVisibilityPlugins::SetRenderWareCamera(RwCamera *camera)
|
CVisibilityPlugins::SetRenderWareCamera(RwCamera *camera)
|
||||||
{
|
{
|
||||||
@ -215,11 +219,11 @@ CVisibilityPlugins::SetRenderWareCamera(RwCamera *camera)
|
|||||||
else
|
else
|
||||||
ms_cullCompsDist = sq(TheCamera.LODDistMultiplier * 20.0f);
|
ms_cullCompsDist = sq(TheCamera.LODDistMultiplier * 20.0f);
|
||||||
|
|
||||||
ms_vehicleLod0Dist = sq(70.0f * TheCamera.GenerationDistMultiplier);
|
ms_vehicleLod0Dist = sq(70.0f * VEHICLE_LODDIST_MULTIPLIER);
|
||||||
ms_vehicleLod1Dist = sq(90.0f * TheCamera.GenerationDistMultiplier);
|
ms_vehicleLod1Dist = sq(90.0f * VEHICLE_LODDIST_MULTIPLIER);
|
||||||
ms_vehicleFadeDist = sq(100.0f * TheCamera.GenerationDistMultiplier);
|
ms_vehicleFadeDist = sq(100.0f * VEHICLE_LODDIST_MULTIPLIER);
|
||||||
ms_bigVehicleLod0Dist = sq(60.0f * TheCamera.GenerationDistMultiplier);
|
ms_bigVehicleLod0Dist = sq(60.0f * VEHICLE_LODDIST_MULTIPLIER);
|
||||||
ms_bigVehicleLod1Dist = sq(150.0f * TheCamera.GenerationDistMultiplier);
|
ms_bigVehicleLod1Dist = sq(150.0f * VEHICLE_LODDIST_MULTIPLIER);
|
||||||
ms_pedLod0Dist = sq(25.0f * TheCamera.LODDistMultiplier);
|
ms_pedLod0Dist = sq(25.0f * TheCamera.LODDistMultiplier);
|
||||||
ms_pedLod1Dist = sq(60.0f * TheCamera.LODDistMultiplier);
|
ms_pedLod1Dist = sq(60.0f * TheCamera.LODDistMultiplier);
|
||||||
ms_pedFadeDist = sq(70.0f * TheCamera.LODDistMultiplier);
|
ms_pedFadeDist = sq(70.0f * TheCamera.LODDistMultiplier);
|
||||||
@ -311,7 +315,12 @@ CVisibilityPlugins::RenderWheelAtomicCB(RpAtomic *atomic)
|
|||||||
m = RwFrameGetLTM(RpAtomicGetFrame(atomic));
|
m = RwFrameGetLTM(RpAtomicGetFrame(atomic));
|
||||||
RwV3dSub(&view, RwMatrixGetPos(m), ms_pCameraPosn);
|
RwV3dSub(&view, RwMatrixGetPos(m), ms_pCameraPosn);
|
||||||
len = RwV3dLength(&view);
|
len = RwV3dLength(&view);
|
||||||
|
#ifdef FIX_BUGS
|
||||||
|
// from VC
|
||||||
|
lodatm = mi->GetAtomicFromDistance(len * TheCamera.LODDistMultiplier / VEHICLE_LODDIST_MULTIPLIER);
|
||||||
|
#else
|
||||||
lodatm = mi->GetAtomicFromDistance(len);
|
lodatm = mi->GetAtomicFromDistance(len);
|
||||||
|
#endif
|
||||||
if(lodatm){
|
if(lodatm){
|
||||||
if(RpAtomicGetGeometry(lodatm) != RpAtomicGetGeometry(atomic))
|
if(RpAtomicGetGeometry(lodatm) != RpAtomicGetGeometry(atomic))
|
||||||
RpAtomicSetGeometry(atomic, RpAtomicGetGeometry(lodatm), rpATOMICSAMEBOUNDINGSPHERE);
|
RpAtomicSetGeometry(atomic, RpAtomicGetGeometry(lodatm), rpATOMICSAMEBOUNDINGSPHERE);
|
||||||
|
@ -83,9 +83,6 @@ enum eGameState
|
|||||||
GS_FRONTEND,
|
GS_FRONTEND,
|
||||||
GS_INIT_PLAYING_GAME,
|
GS_INIT_PLAYING_GAME,
|
||||||
GS_PLAYING_GAME,
|
GS_PLAYING_GAME,
|
||||||
#ifndef MASTER
|
|
||||||
GS_ANIMVIEWER,
|
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
extern RwUInt32 gGameState;
|
extern RwUInt32 gGameState;
|
||||||
|
|
||||||
|
@ -70,9 +70,6 @@ static psGlobalType PsGlobal;
|
|||||||
|
|
||||||
#define PSGLOBAL(var) (((psGlobalType *)(RsGlobal.ps))->var)
|
#define PSGLOBAL(var) (((psGlobalType *)(RsGlobal.ps))->var)
|
||||||
|
|
||||||
#undef MAKEPOINTS
|
|
||||||
#define MAKEPOINTS(l) (*((POINTS /*FAR*/ *)&(l)))
|
|
||||||
|
|
||||||
size_t _dwMemAvailPhys;
|
size_t _dwMemAvailPhys;
|
||||||
RwUInt32 gGameState;
|
RwUInt32 gGameState;
|
||||||
|
|
||||||
@ -870,6 +867,36 @@ void _InputInitialiseJoys()
|
|||||||
PSGLOBAL(joy1id) = -1;
|
PSGLOBAL(joy1id) = -1;
|
||||||
PSGLOBAL(joy2id) = -1;
|
PSGLOBAL(joy2id) = -1;
|
||||||
|
|
||||||
|
// Load our gamepad mappings.
|
||||||
|
#define SDL_GAMEPAD_DB_PATH "gamecontrollerdb.txt"
|
||||||
|
FILE *f = fopen(SDL_GAMEPAD_DB_PATH, "rb");
|
||||||
|
if (f) {
|
||||||
|
fseek(f, 0, SEEK_END);
|
||||||
|
size_t fsize = ftell(f);
|
||||||
|
fseek(f, 0, SEEK_SET);
|
||||||
|
|
||||||
|
char *db = (char*)malloc(fsize + 1);
|
||||||
|
if (fread(db, 1, fsize, f) == fsize) {
|
||||||
|
db[fsize] = '\0';
|
||||||
|
|
||||||
|
if (glfwUpdateGamepadMappings(db) == GLFW_FALSE)
|
||||||
|
Error("glfwUpdateGamepadMappings didn't succeed, check " SDL_GAMEPAD_DB_PATH ".\n");
|
||||||
|
} else
|
||||||
|
Error("fread on " SDL_GAMEPAD_DB_PATH " wasn't successful.\n");
|
||||||
|
|
||||||
|
free(db);
|
||||||
|
fclose(f);
|
||||||
|
} else
|
||||||
|
printf("You don't seem to have copied " SDL_GAMEPAD_DB_PATH " file from re3/gamefiles to GTA3 directory. Some gamepads may not be recognized.\n");
|
||||||
|
|
||||||
|
#undef SDL_GAMEPAD_DB_PATH
|
||||||
|
|
||||||
|
// But always overwrite it with the one in SDL_GAMECONTROLLERCONFIG.
|
||||||
|
char const* EnvControlConfig = getenv("SDL_GAMECONTROLLERCONFIG");
|
||||||
|
if (EnvControlConfig != nil) {
|
||||||
|
glfwUpdateGamepadMappings(EnvControlConfig);
|
||||||
|
}
|
||||||
|
|
||||||
for (int i = 0; i <= GLFW_JOYSTICK_LAST; i++) {
|
for (int i = 0; i <= GLFW_JOYSTICK_LAST; i++) {
|
||||||
if (glfwJoystickPresent(i) && !IsThisJoystickBlacklisted(i)) {
|
if (glfwJoystickPresent(i) && !IsThisJoystickBlacklisted(i)) {
|
||||||
if (PSGLOBAL(joy1id) == -1)
|
if (PSGLOBAL(joy1id) == -1)
|
||||||
@ -1175,15 +1202,15 @@ void InitialiseLanguage()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TheText.Unload();
|
|
||||||
TheText.Load();
|
|
||||||
|
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
// TODO this is needed for strcasecmp to work correctly across all languages, but can these cause other problems??
|
// TODO this is needed for strcasecmp to work correctly across all languages, but can these cause other problems??
|
||||||
setlocale(LC_CTYPE, "C");
|
setlocale(LC_CTYPE, "C");
|
||||||
setlocale(LC_COLLATE, "C");
|
setlocale(LC_COLLATE, "C");
|
||||||
setlocale(LC_NUMERIC, "C");
|
setlocale(LC_NUMERIC, "C");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
TheText.Unload();
|
||||||
|
TheText.Load();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1230,17 +1257,11 @@ void resizeCB(GLFWwindow* window, int width, int height) {
|
|||||||
* memory things don't work.
|
* memory things don't work.
|
||||||
*/
|
*/
|
||||||
/* redraw window */
|
/* redraw window */
|
||||||
#ifndef MASTER
|
|
||||||
if (RwInitialised && (gGameState == GS_PLAYING_GAME || gGameState == GS_ANIMVIEWER))
|
|
||||||
{
|
|
||||||
RsEventHandler((gGameState == GS_PLAYING_GAME ? rsIDLE : rsANIMVIEWER), (void *)TRUE);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
if (RwInitialised && gGameState == GS_PLAYING_GAME)
|
if (RwInitialised && gGameState == GS_PLAYING_GAME)
|
||||||
{
|
{
|
||||||
RsEventHandler(rsIDLE, (void *)TRUE);
|
RsEventHandler(rsIDLE, (void *)TRUE);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
if (RwInitialised && height > 0 && width > 0) {
|
if (RwInitialised && height > 0 && width > 0) {
|
||||||
RwRect r;
|
RwRect r;
|
||||||
@ -1620,18 +1641,6 @@ main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (TurnOnAnimViewer)
|
|
||||||
{
|
|
||||||
#ifndef MASTER
|
|
||||||
CAnimViewer::Initialise();
|
|
||||||
#ifndef PS2_MENU
|
|
||||||
FrontEndMenuManager.m_bGameNotLoaded = false;
|
|
||||||
#endif
|
|
||||||
gGameState = GS_ANIMVIEWER;
|
|
||||||
TurnOnAnimViewer = false;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
initkeymap();
|
initkeymap();
|
||||||
|
|
||||||
while ( TRUE )
|
while ( TRUE )
|
||||||
@ -1650,6 +1659,18 @@ main(int argc, char *argv[])
|
|||||||
* Enter the message processing loop...
|
* Enter the message processing loop...
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef MASTER
|
||||||
|
if (gbModelViewer) {
|
||||||
|
// This is TheModelViewer in LCS, but not compiled on III Mobile.
|
||||||
|
LoadingScreen("Loading the ModelViewer", NULL, GetRandomSplashScreen());
|
||||||
|
CAnimViewer::Initialise();
|
||||||
|
CTimer::Update();
|
||||||
|
#ifndef PS2_MENU
|
||||||
|
FrontEndMenuManager.m_bGameNotLoaded = false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef PS2_MENU
|
#ifdef PS2_MENU
|
||||||
if (TheMemoryCard.m_bWantToLoad)
|
if (TheMemoryCard.m_bWantToLoad)
|
||||||
LoadSplash(GetLevelSplashScreen(CGame::currLevel));
|
LoadSplash(GetLevelSplashScreen(CGame::currLevel));
|
||||||
@ -1664,6 +1685,12 @@ main(int argc, char *argv[])
|
|||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
glfwPollEvents();
|
glfwPollEvents();
|
||||||
|
#ifndef MASTER
|
||||||
|
if (gbModelViewer) {
|
||||||
|
// This is TheModelViewerCore in LCS, but TheModelViewer on other state-machine III-VCs.
|
||||||
|
TheModelViewer();
|
||||||
|
} else
|
||||||
|
#endif
|
||||||
if ( ForegroundApp )
|
if ( ForegroundApp )
|
||||||
{
|
{
|
||||||
switch ( gGameState )
|
switch ( gGameState )
|
||||||
@ -1867,18 +1894,6 @@ main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#ifndef MASTER
|
|
||||||
case GS_ANIMVIEWER:
|
|
||||||
{
|
|
||||||
float ms = (float)CTimer::GetCurrentTimeInCycles() / (float)CTimer::GetCyclesPerMillisecond();
|
|
||||||
if (RwInitialised)
|
|
||||||
{
|
|
||||||
if (!CMenuManager::m_PrefsFrameLimiter || (1000.0f / (float)RsGlobal.maxFPS) < ms)
|
|
||||||
RsEventHandler(rsANIMVIEWER, (void*)TRUE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -1950,12 +1965,13 @@ main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
#ifndef MASTER
|
||||||
|
if ( gbModelViewer )
|
||||||
|
CAnimViewer::Shutdown();
|
||||||
|
else
|
||||||
|
#endif
|
||||||
if ( gGameState == GS_PLAYING_GAME )
|
if ( gGameState == GS_PLAYING_GAME )
|
||||||
CGame::ShutDown();
|
CGame::ShutDown();
|
||||||
#ifndef MASTER
|
|
||||||
else if ( gGameState == GS_ANIMVIEWER )
|
|
||||||
CAnimViewer::Shutdown();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
CTimer::Stop();
|
CTimer::Stop();
|
||||||
|
|
||||||
@ -1977,12 +1993,13 @@ main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef MASTER
|
||||||
|
if ( gbModelViewer )
|
||||||
|
CAnimViewer::Shutdown();
|
||||||
|
else
|
||||||
|
#endif
|
||||||
if ( gGameState == GS_PLAYING_GAME )
|
if ( gGameState == GS_PLAYING_GAME )
|
||||||
CGame::ShutDown();
|
CGame::ShutDown();
|
||||||
#ifndef MASTER
|
|
||||||
else if ( gGameState == GS_ANIMVIEWER )
|
|
||||||
CAnimViewer::Shutdown();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
DMAudio.Terminate();
|
DMAudio.Terminate();
|
||||||
|
|
||||||
|
@ -10,14 +10,13 @@
|
|||||||
|
|
||||||
#include "skeleton.h"
|
#include "skeleton.h"
|
||||||
#include "platform.h"
|
#include "platform.h"
|
||||||
|
#include "main.h"
|
||||||
#include "MemoryHeap.h"
|
#include "MemoryHeap.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static RwBool DefaultVideoMode = TRUE;
|
static RwBool DefaultVideoMode = TRUE;
|
||||||
|
|
||||||
bool TurnOnAnimViewer = false;
|
|
||||||
|
|
||||||
RsGlobalType RsGlobal;
|
RsGlobalType RsGlobal;
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
@ -162,7 +161,7 @@ rsPreInitCommandLine(RwChar *arg)
|
|||||||
#ifndef MASTER
|
#ifndef MASTER
|
||||||
if (!strcmp(arg, RWSTRING("-animviewer")))
|
if (!strcmp(arg, RWSTRING("-animviewer")))
|
||||||
{
|
{
|
||||||
TurnOnAnimViewer = TRUE;
|
gbModelViewer = TRUE;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -79,11 +79,8 @@ enum RsEvent
|
|||||||
rsPADANALOGUERIGHTRESET,
|
rsPADANALOGUERIGHTRESET,
|
||||||
rsPREINITCOMMANDLINE,
|
rsPREINITCOMMANDLINE,
|
||||||
rsACTIVATE,
|
rsACTIVATE,
|
||||||
rsANIMVIEWER,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
extern bool TurnOnAnimViewer;
|
|
||||||
|
|
||||||
typedef enum RsEvent RsEvent;
|
typedef enum RsEvent RsEvent;
|
||||||
|
|
||||||
typedef RsEventStatus (*RsInputEventHandler)(RsEvent event, void *param);
|
typedef RsEventStatus (*RsInputEventHandler)(RsEvent event, void *param);
|
||||||
|
@ -1017,17 +1017,12 @@ MainWndProc(HWND window, UINT message, WPARAM wParam, LPARAM lParam)
|
|||||||
RECT rect;
|
RECT rect;
|
||||||
|
|
||||||
/* redraw window */
|
/* redraw window */
|
||||||
#ifndef MASTER
|
|
||||||
if (RwInitialised && (gGameState == GS_PLAYING_GAME || gGameState == GS_ANIMVIEWER))
|
|
||||||
{
|
|
||||||
RsEventHandler((gGameState == GS_PLAYING_GAME ? rsIDLE : rsANIMVIEWER), (void *)TRUE);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
if (RwInitialised && gGameState == GS_PLAYING_GAME)
|
if (RwInitialised && gGameState == GS_PLAYING_GAME)
|
||||||
{
|
{
|
||||||
RsEventHandler(rsIDLE, (void *)TRUE);
|
RsEventHandler(rsIDLE, (void *)TRUE);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
/* Manually resize window */
|
/* Manually resize window */
|
||||||
rect.left = rect.top = 0;
|
rect.left = rect.top = 0;
|
||||||
rect.bottom = newPos->bottom - newPos->top;
|
rect.bottom = newPos->bottom - newPos->top;
|
||||||
@ -2183,17 +2178,17 @@ WinMain(HINSTANCE instance,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (TurnOnAnimViewer)
|
|
||||||
{
|
|
||||||
#ifndef MASTER
|
#ifndef MASTER
|
||||||
|
if (gbModelViewer) {
|
||||||
|
// This is TheModelViewer in LCS, but not compiled on III Mobile.
|
||||||
|
LoadingScreen("Loading the ModelViewer", NULL, GetRandomSplashScreen());
|
||||||
CAnimViewer::Initialise();
|
CAnimViewer::Initialise();
|
||||||
|
CTimer::Update();
|
||||||
#ifndef PS2_MENU
|
#ifndef PS2_MENU
|
||||||
FrontEndMenuManager.m_bGameNotLoaded = false;
|
FrontEndMenuManager.m_bGameNotLoaded = false;
|
||||||
#endif
|
|
||||||
gGameState = GS_ANIMVIEWER;
|
|
||||||
TurnOnAnimViewer = false;
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
while ( TRUE )
|
while ( TRUE )
|
||||||
{
|
{
|
||||||
@ -2238,6 +2233,12 @@ WinMain(HINSTANCE instance,
|
|||||||
DispatchMessage(&message);
|
DispatchMessage(&message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#ifndef MASTER
|
||||||
|
else if (gbModelViewer) {
|
||||||
|
// This is TheModelViewerCore in LCS
|
||||||
|
TheModelViewer();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
else if( ForegroundApp )
|
else if( ForegroundApp )
|
||||||
{
|
{
|
||||||
switch ( gGameState )
|
switch ( gGameState )
|
||||||
@ -2451,18 +2452,6 @@ WinMain(HINSTANCE instance,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#ifndef MASTER
|
|
||||||
case GS_ANIMVIEWER:
|
|
||||||
{
|
|
||||||
float ms = (float)CTimer::GetCurrentTimeInCycles() / (float)CTimer::GetCyclesPerMillisecond();
|
|
||||||
if (RwInitialised)
|
|
||||||
{
|
|
||||||
if (!CMenuManager::m_PrefsFrameLimiter || (1000.0f / (float)RsGlobal.maxFPS) < ms)
|
|
||||||
RsEventHandler(rsANIMVIEWER, (void*)TRUE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -2534,12 +2523,13 @@ WinMain(HINSTANCE instance,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
#ifndef MASTER
|
||||||
|
if ( gbModelViewer )
|
||||||
|
CAnimViewer::Shutdown();
|
||||||
|
else
|
||||||
|
#endif
|
||||||
if ( gGameState == GS_PLAYING_GAME )
|
if ( gGameState == GS_PLAYING_GAME )
|
||||||
CGame::ShutDown();
|
CGame::ShutDown();
|
||||||
#ifndef MASTER
|
|
||||||
else if ( gGameState == GS_ANIMVIEWER )
|
|
||||||
CAnimViewer::Shutdown();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
CTimer::Stop();
|
CTimer::Stop();
|
||||||
|
|
||||||
@ -2561,12 +2551,13 @@ WinMain(HINSTANCE instance,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef MASTER
|
||||||
|
if ( gbModelViewer )
|
||||||
|
CAnimViewer::Shutdown();
|
||||||
|
else
|
||||||
|
#endif
|
||||||
if ( gGameState == GS_PLAYING_GAME )
|
if ( gGameState == GS_PLAYING_GAME )
|
||||||
CGame::ShutDown();
|
CGame::ShutDown();
|
||||||
#ifndef MASTER
|
|
||||||
else if ( gGameState == GS_ANIMVIEWER )
|
|
||||||
CAnimViewer::Shutdown();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
DMAudio.Terminate();
|
DMAudio.Terminate();
|
||||||
|
|
||||||
|
@ -768,7 +768,7 @@ CAutomobile::ProcessControl(void)
|
|||||||
adhesion *= CSurfaceTable::GetWetMultiplier(m_aWheelColPoints[CARWHEEL_FRONT_LEFT].surfaceB);
|
adhesion *= CSurfaceTable::GetWetMultiplier(m_aWheelColPoints[CARWHEEL_FRONT_LEFT].surfaceB);
|
||||||
WheelState[CARWHEEL_FRONT_LEFT] = m_aWheelState[CARWHEEL_FRONT_LEFT];
|
WheelState[CARWHEEL_FRONT_LEFT] = m_aWheelState[CARWHEEL_FRONT_LEFT];
|
||||||
|
|
||||||
if(Damage.GetWheelStatus(VEHWHEEL_FRONT_LEFT) == WHEEL_STATUS_BURST)
|
if(Damage.GetWheelStatus(CARWHEEL_FRONT_LEFT) == WHEEL_STATUS_BURST)
|
||||||
ProcessWheel(wheelFwd, wheelRight,
|
ProcessWheel(wheelFwd, wheelRight,
|
||||||
contactSpeeds[CARWHEEL_FRONT_LEFT], contactPoints[CARWHEEL_FRONT_LEFT],
|
contactSpeeds[CARWHEEL_FRONT_LEFT], contactPoints[CARWHEEL_FRONT_LEFT],
|
||||||
m_nWheelsOnGround, fThrust,
|
m_nWheelsOnGround, fThrust,
|
||||||
@ -802,7 +802,7 @@ CAutomobile::ProcessControl(void)
|
|||||||
adhesion *= CSurfaceTable::GetWetMultiplier(m_aWheelColPoints[CARWHEEL_FRONT_RIGHT].surfaceB);
|
adhesion *= CSurfaceTable::GetWetMultiplier(m_aWheelColPoints[CARWHEEL_FRONT_RIGHT].surfaceB);
|
||||||
WheelState[CARWHEEL_FRONT_RIGHT] = m_aWheelState[CARWHEEL_FRONT_RIGHT];
|
WheelState[CARWHEEL_FRONT_RIGHT] = m_aWheelState[CARWHEEL_FRONT_RIGHT];
|
||||||
|
|
||||||
if(Damage.GetWheelStatus(VEHWHEEL_FRONT_RIGHT) == WHEEL_STATUS_BURST)
|
if(Damage.GetWheelStatus(CARWHEEL_FRONT_RIGHT) == WHEEL_STATUS_BURST)
|
||||||
ProcessWheel(wheelFwd, wheelRight,
|
ProcessWheel(wheelFwd, wheelRight,
|
||||||
contactSpeeds[CARWHEEL_FRONT_RIGHT], contactPoints[CARWHEEL_FRONT_RIGHT],
|
contactSpeeds[CARWHEEL_FRONT_RIGHT], contactPoints[CARWHEEL_FRONT_RIGHT],
|
||||||
m_nWheelsOnGround, fThrust,
|
m_nWheelsOnGround, fThrust,
|
||||||
@ -883,7 +883,7 @@ CAutomobile::ProcessControl(void)
|
|||||||
adhesion *= CSurfaceTable::GetWetMultiplier(m_aWheelColPoints[CARWHEEL_REAR_LEFT].surfaceB);
|
adhesion *= CSurfaceTable::GetWetMultiplier(m_aWheelColPoints[CARWHEEL_REAR_LEFT].surfaceB);
|
||||||
WheelState[CARWHEEL_REAR_LEFT] = m_aWheelState[CARWHEEL_REAR_LEFT];
|
WheelState[CARWHEEL_REAR_LEFT] = m_aWheelState[CARWHEEL_REAR_LEFT];
|
||||||
|
|
||||||
if(Damage.GetWheelStatus(VEHWHEEL_REAR_LEFT) == WHEEL_STATUS_BURST)
|
if(Damage.GetWheelStatus(CARWHEEL_REAR_LEFT) == WHEEL_STATUS_BURST)
|
||||||
ProcessWheel(wheelFwd, wheelRight,
|
ProcessWheel(wheelFwd, wheelRight,
|
||||||
contactSpeeds[CARWHEEL_REAR_LEFT], contactPoints[CARWHEEL_REAR_LEFT],
|
contactSpeeds[CARWHEEL_REAR_LEFT], contactPoints[CARWHEEL_REAR_LEFT],
|
||||||
m_nWheelsOnGround, fThrust,
|
m_nWheelsOnGround, fThrust,
|
||||||
@ -917,7 +917,7 @@ CAutomobile::ProcessControl(void)
|
|||||||
adhesion *= CSurfaceTable::GetWetMultiplier(m_aWheelColPoints[CARWHEEL_REAR_RIGHT].surfaceB);
|
adhesion *= CSurfaceTable::GetWetMultiplier(m_aWheelColPoints[CARWHEEL_REAR_RIGHT].surfaceB);
|
||||||
WheelState[CARWHEEL_REAR_RIGHT] = m_aWheelState[CARWHEEL_REAR_RIGHT];
|
WheelState[CARWHEEL_REAR_RIGHT] = m_aWheelState[CARWHEEL_REAR_RIGHT];
|
||||||
|
|
||||||
if(Damage.GetWheelStatus(VEHWHEEL_REAR_RIGHT) == WHEEL_STATUS_BURST)
|
if(Damage.GetWheelStatus(CARWHEEL_REAR_RIGHT) == WHEEL_STATUS_BURST)
|
||||||
ProcessWheel(wheelFwd, wheelRight,
|
ProcessWheel(wheelFwd, wheelRight,
|
||||||
contactSpeeds[CARWHEEL_REAR_RIGHT], contactPoints[CARWHEEL_REAR_RIGHT],
|
contactSpeeds[CARWHEEL_REAR_RIGHT], contactPoints[CARWHEEL_REAR_RIGHT],
|
||||||
m_nWheelsOnGround, fThrust,
|
m_nWheelsOnGround, fThrust,
|
||||||
@ -3946,10 +3946,10 @@ void
|
|||||||
CAutomobile::BurstTyre(uint8 wheel)
|
CAutomobile::BurstTyre(uint8 wheel)
|
||||||
{
|
{
|
||||||
switch(wheel){
|
switch(wheel){
|
||||||
case CAR_PIECE_WHEEL_LF: wheel = VEHWHEEL_FRONT_LEFT; break;
|
case CAR_PIECE_WHEEL_LF: wheel = CARWHEEL_FRONT_LEFT; break;
|
||||||
case CAR_PIECE_WHEEL_LR: wheel = VEHWHEEL_REAR_LEFT; break;
|
case CAR_PIECE_WHEEL_RF: wheel = CARWHEEL_FRONT_RIGHT; break;
|
||||||
case CAR_PIECE_WHEEL_RF: wheel = VEHWHEEL_FRONT_RIGHT; break;
|
case CAR_PIECE_WHEEL_LR: wheel = CARWHEEL_REAR_LEFT; break;
|
||||||
case CAR_PIECE_WHEEL_RR: wheel = VEHWHEEL_REAR_RIGHT; break;
|
case CAR_PIECE_WHEEL_RR: wheel = CARWHEEL_REAR_RIGHT; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
int status = Damage.GetWheelStatus(wheel);
|
int status = Damage.GetWheelStatus(wheel);
|
||||||
|
@ -30,8 +30,6 @@ enum eCarNodes
|
|||||||
NUM_CAR_NODES,
|
NUM_CAR_NODES,
|
||||||
};
|
};
|
||||||
|
|
||||||
// These are used for all the wheel arrays
|
|
||||||
// DON'T confuse with VEHWHEEL, which are vehicle components
|
|
||||||
enum {
|
enum {
|
||||||
CARWHEEL_FRONT_LEFT,
|
CARWHEEL_FRONT_LEFT,
|
||||||
CARWHEEL_REAR_LEFT,
|
CARWHEEL_REAR_LEFT,
|
||||||
|
@ -11,7 +11,7 @@ class CBuilding;
|
|||||||
class CCrane
|
class CCrane
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
enum CraneState : uint8 {
|
enum CraneState {
|
||||||
IDLE = 0,
|
IDLE = 0,
|
||||||
GOING_TOWARDS_TARGET = 1,
|
GOING_TOWARDS_TARGET = 1,
|
||||||
LIFTING_TARGET = 2,
|
LIFTING_TARGET = 2,
|
||||||
@ -19,7 +19,7 @@ public:
|
|||||||
ROTATING_TARGET = 4,
|
ROTATING_TARGET = 4,
|
||||||
DROPPING_TARGET = 5
|
DROPPING_TARGET = 5
|
||||||
};
|
};
|
||||||
enum CraneStatus : uint8 {
|
enum CraneStatus {
|
||||||
NONE = 0,
|
NONE = 0,
|
||||||
ACTIVATED = 1,
|
ACTIVATED = 1,
|
||||||
DEACTIVATED = 2
|
DEACTIVATED = 2
|
||||||
@ -47,8 +47,8 @@ public:
|
|||||||
CVector2D m_vecHookVelocity;
|
CVector2D m_vecHookVelocity;
|
||||||
CVehicle *m_pVehiclePickedUp;
|
CVehicle *m_pVehiclePickedUp;
|
||||||
uint32 m_nTimeForNextCheck;
|
uint32 m_nTimeForNextCheck;
|
||||||
CraneStatus m_nCraneStatus;
|
uint8 m_nCraneStatus;
|
||||||
CraneState m_nCraneState;
|
uint8 m_nCraneState;
|
||||||
uint8 m_nVehiclesCollected;
|
uint8 m_nVehiclesCollected;
|
||||||
bool m_bIsCrusher;
|
bool m_bIsCrusher;
|
||||||
bool m_bIsMilitaryCrane;
|
bool m_bIsMilitaryCrane;
|
||||||
|
@ -65,7 +65,7 @@ enum tVehicleType
|
|||||||
NUMHANDLINGS
|
NUMHANDLINGS
|
||||||
};
|
};
|
||||||
|
|
||||||
enum tField : uint32 // most likely a handling field enum, never used so :shrug:
|
enum tField // most likely a handling field enum, never used so :shrug:
|
||||||
{
|
{
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -57,14 +57,6 @@ enum eLights
|
|||||||
VEHLIGHT_REAR_RIGHT,
|
VEHLIGHT_REAR_RIGHT,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum eWheels
|
|
||||||
{
|
|
||||||
VEHWHEEL_FRONT_LEFT,
|
|
||||||
VEHWHEEL_FRONT_RIGHT,
|
|
||||||
VEHWHEEL_REAR_LEFT,
|
|
||||||
VEHWHEEL_REAR_RIGHT,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
CAR_PIECE_BONNET = 1,
|
CAR_PIECE_BONNET = 1,
|
||||||
|
@ -385,7 +385,7 @@ CWeapon::FireMelee(CEntity *shooter, CVector &fireSource)
|
|||||||
if ( victimPed->bUsesCollision || victimPed->Dead() || victimPed->Driving() )
|
if ( victimPed->bUsesCollision || victimPed->Dead() || victimPed->Driving() )
|
||||||
{
|
{
|
||||||
CVector victimPedPos = victimPed->GetPosition();
|
CVector victimPedPos = victimPed->GetPosition();
|
||||||
if ( SQR(victimPedRadius) > (victimPedPos-(*fireSource)).MagnitudeSqr() )
|
if ( SQR(victimPedRadius) > (victimPedPos-fireSource).MagnitudeSqr() )
|
||||||
{
|
{
|
||||||
CVector collisionDist;
|
CVector collisionDist;
|
||||||
|
|
||||||
@ -393,7 +393,7 @@ CWeapon::FireMelee(CEntity *shooter, CVector &fireSource)
|
|||||||
while ( s < victimPedCol->numSpheres )
|
while ( s < victimPedCol->numSpheres )
|
||||||
{
|
{
|
||||||
CColSphere *sphere = &victimPedCol->spheres[s];
|
CColSphere *sphere = &victimPedCol->spheres[s];
|
||||||
collisionDist = victimPedPos+sphere->center-(*fireSource);
|
collisionDist = victimPedPos+sphere->center-fireSource;
|
||||||
|
|
||||||
if ( SQR(sphere->radius + info->m_fRadius) > collisionDist.MagnitudeSqr() )
|
if ( SQR(sphere->radius + info->m_fRadius) > collisionDist.MagnitudeSqr() )
|
||||||
{
|
{
|
||||||
|
File diff suppressed because it is too large
Load Diff
2
vendor/librw
vendored
2
vendor/librw
vendored
@ -1 +1 @@
|
|||||||
Subproject commit 2066cf6634383e056cd5dda105e87f8da04b1ed8
|
Subproject commit ed9cb45ee9a2749a0a89231bf16f09a5c53bfc92
|
Loading…
Reference in New Issue
Block a user