Commit Graph

522 Commits (341ca691fc8a465a81b48d7953fc800a887b46fd)

Author SHA1 Message Date
David Cernat 8df08c7d10 [General] Implement PlayerItemUse packet
Players can no longer unilaterally use items on themselves in their inventory. When they try to use an item, they send a PlayerItemUse packet to the server with the item's details. A serverside script can then check the item and either send the packet back to make the item use go through or drop it.
6 years ago
AnyOldName3 a2b54714d4 Merge remote-tracking branch 'upstream/master' into osgshadow-test-vdsm 6 years ago
Andrei Kortunov ac98797999 Add missing file 7 years ago
AnyOldName3 cc23a968d1 Merge upstream/master 7 years ago
David Cernat 9823a77bf2 [General] Turn PlayerRegionAuthority into WorldRegionAuthority
WorldRegionAuthority is a Worldstate packet.
7 years ago
David Cernat 72d286473b [General] Move credits integrity error message to new ErrorMessages file
Additionally, use correct log level for credit integrity message on server.
7 years ago
David Cernat 0b5cb15f71 [General] Turn GameWeather into WorldWeather, now a WorldstatePacket 7 years ago
David Cernat 3649cf553f [General] Rename PlayerKillCount into WorldKillCount
This should clarify the real meaning of the packet and its associated event.

The event itself has been renamed from OnPlayerKillCount to OnWorldKillCount.
7 years ago
David Cernat 81b160cae8 [General] Add placeholder for ObjectActivate packet 7 years ago
David Cernat 61da0d2475 [General] Turn PlayerInteraction into PlayerInput 7 years ago
David Cernat 32b6134fad [General] Add placeholder for CellReplace packet 7 years ago
David Cernat a471f5e452 [General] Turn CellCreate into a Worldstate packet 7 years ago
Grim Kriegor 2fcde5e8ba [General] Temporarily disable the new OpenMW crash catcher
This new crash catcher is preventing TES3MP from building on GNU/Linux
`components/crashcatcher/crashcatcher.cpp:23:28: fatal error: SDL_messagebox.h: No such file or directory`
Disable it until the developers isolate the issue and patch it
7 years ago
David Cernat 6cb5ac6e63 Merge pull request #457 from OpenMW/master while resolving conflicts
Conflicts:
	CMakeLists.txt
	apps/openmw/engine.cpp
	apps/openmw/main.cpp
	apps/openmw/mwgui/windowmanagerimp.cpp
	apps/openmw/mwmechanics/character.cpp
	components/CMakeLists.txt
7 years ago
Doc West 467989cdd5 Moved crashcatcher to a component and also use it in CS
Reworked debugger detection (failed on gdb 7.11), it now uses /proc to detect the debugger
7 years ago
David Cernat a236ffc4be Merge pull request #456 from OpenMW/master while resolving conflicts
# Conflicts:
#	.travis.yml
#	README.md
#	apps/openmw/mwgui/quickkeysmenu.cpp
#	apps/openmw/mwmechanics/actors.cpp
#	apps/openmw/mwmechanics/combat.cpp
7 years ago
AnyOldName3 553094669b Merge upstream/master (& fix merge conflicts) 7 years ago
Miloslav Číž c3d7ee5a9e Resolve merge conflicts 7 years ago
Miloslav Číž db8aaa74d6 Start cell border debug drawing 7 years ago
David Cernat 72862dc255 [General] Turn PlayerMap into WorldMap, now a Worldstate packet 7 years ago
David Cernat c24157f6f9 [General] Fix CMakeLists in components for BaseObject 7 years ago
David Cernat 416ee77639 [General] Add placeholder for WorldCollisionOverride packet 7 years ago
David Cernat 0be6de6607 [General] Turn RecordDynamic into a Worldstate packet 7 years ago
David Cernat da66face25 [General] Rename GameTime packet into WorldTime 7 years ago
David Cernat 5af1150ab2 [General] Turn GameTime into a Worldstate packet 7 years ago
David Cernat 43a944ddaf [General] Add and implement new Worldstate packet type 7 years ago
David Cernat 78234f9071 [General] Rename Event into ObjectList & WorldObject into BaseObject 7 years ago
David Cernat 6bf3a0be1e [General] Rename WorldPackets into ObjectPackets for clarity 7 years ago
AnyOldName3 44b2cf2b7f Merge upstream. 7 years ago
David Cernat 9e5ddeac50
Merge pull request #408 from OpenMW/master
Add OpenMW commits up to 18 Apr 2018
7 years ago
Andreas Sturmlechner 2c9d46a60b
Fix build with Qt 5.11_beta3 (dropping qt5_use_modules) 7 years ago
David Cernat 365f485e8d Merge pull request #397 from OpenMW/master while resolving conflicts
Conflicts:
	components/CMakeLists.txt
7 years ago
bret curtis 4890ecd357 remove native GLESv* support, as it never worked; make things less complicated as result, fixed lighting.glsl to work with gl2es thanks to ptitSeb 7 years ago
AnyOldName3 273914aba8 Add osgShadow ViewDependentShadowMaps as they can be found in OSG's GitHub Repository 7 years ago
David Cernat 3d80e2db62 [General] Add placeholders for new packet types, part 2 7 years ago
David Cernat 02af7f6ba1 [General] Add placeholders for new packet types 7 years ago
David Cernat cac2c6c1e8 Merge pull request #360 from TES3MP/0.6.1-openmw-updates while resolving conflicts 7 years ago
AnyOldName3 6e0b61d084 Add missing libraries to components target 7 years ago
AnyOldName3 e201e359a9 Move Shadow to Components 7 years ago
David Cernat 37304655da Merge pull request #326 from OpenMW/master
Add OpenMW commits up to 25 Oct 2017
7 years ago
David Cernat 50d5fffb7f [General] Add and implement PlayerQuickKeys packet 7 years ago
AnyOldName3 c1a871ff1f Make indentation consistent. 7 years ago
AnyOldName3 daf7d8451c Switch to a more reliable method of passing the git-version targt the data it needs 7 years ago
AnyOldName3 e3142b9643 Add missing variables to those forwarded to the git-version target 7 years ago
David Cernat e164e6305e Merge pull request #313 from OpenMW/master while resolving conflicts
# Conflicts:
#	.travis.yml
#	CMakeLists.txt
#	apps/openmw/mwgui/jailscreen.cpp
#	apps/openmw/mwmechanics/mechanicsmanagerimp.cpp
7 years ago
AnyOldName3 c9e86a8ebc Remove superfluous argument 7 years ago
AnyOldName3 f9a3562ccd Remove duplicate macro definition and fix warning 7 years ago
AnyOldName3 2652a89df4 Fix mismatched indentation that apparently the .editorconfig file doesn't handle automatically 7 years ago
AnyOldName3 f8fe992dc0 Adjust CMake's run-time resource handling such that the Windows CI script does not have to copy these files 7 years ago
David Cernat b64f379949 Merge pull request #286 from OpenMW/master while resolving conflicts
# Conflicts:
#	CMakeLists.txt
#	apps/openmw/mwmechanics/actors.hpp
7 years ago
scrawl 5d524a6a10 Add custom version of MorphGeometry replacing osgAnimation
Double buffering, custom bounding box and the update in the cull visitor (instead of update) are now all handled internally rather than needing hacks and/or callbacks.
7 years ago
David Cernat 43a3daf0aa [General] Add & implement PlayerShapeshift packet for werewolf states 8 years ago
David Cernat 3529f9b090 [General] Add placeholders for PlayerJail, ObjectState & ConsoleCommand 8 years ago
David Cernat ebf7740969 [General] Repurpose GameConsole packet as GameSettings & add difficulty to it 8 years ago
David Cernat 70d9374a6a [General] Implement PlayerKillCount packets 8 years ago
David Cernat 27148ce9eb [General] Add placeholders for 12 new packets, to be implemented soon
Additionally, make it slightly clearer who created which previously existing packets.
8 years ago
Koncord 056ec2d434 [General] Fix CMake errors 8 years ago
David Cernat 08de349133 [General] Add placeholders for PlayerTopic & ObjectTrap packets 8 years ago
David Cernat 870fd9a78b [General] Remove ObjectUnlock packet, use ObjectLock with 0 lock instead 8 years ago
David Cernat ad388c7e12 [General] Add placeholders for ActorEquipment & PlayerFaction packets
Also reorder packets and packet processors.
8 years ago
David Cernat 7b07d6651f [General] Add and use PlayerBounty packet and matching script functions 8 years ago
Koncord c35d5a2c6c [Master] Implement Master server 8 years ago
Koncord 4c939f6d0a [General] Split tes3mp components in CMakeLists by group 8 years ago
David Cernat 00aa8839d4 [General] Update CMakeLists in components folder 8 years ago
David Cernat ca8fd1aa72 [General] Remove ActorHeadRotation packet because it would be too spammy 8 years ago
David Cernat e7960eee76 [General] Rename DrawState packets into AnimFlags ones for clarity 8 years ago
David Cernat 0d196af685 [General] Add placeholders for 7 new ActorPackets 8 years ago
David Cernat 742d6f653a [General] Add ActorPosition packet 8 years ago
David Cernat 174f316787 [General] Rename PacketActorFrame into PacketActorTest 8 years ago
David Cernat 070c6a3bd4 [General] Add ActorPacketController & make controller var names clearer 8 years ago
David Cernat 8c2469bf6d [General] Add placeholder ActorList, ActorAuthority & ActorFrame packets 8 years ago
David Cernat 60037e4081 Merge pull request #185 from OpenMW/master
Add OpenMW commits up to 14 Mar 2017
8 years ago
scrawl e36bdb490e Add view data structure for efficient collection of LOD nodes to use for a given camera/intersection 8 years ago
scrawl ce8c4ad4f5 Add quad tree implementation (no rendering yet) 8 years ago
scrawl b1d4bb5708 Add CompositeMapRenderer
Temporarily render all terrain using composite maps for testing purposes
8 years ago
scrawl 35d53acc65 Factor out terrain chunk loading/caching into a new resource manager 8 years ago
scrawl 804f873649 terrain: factor out texture caching into a separate class 8 years ago
scrawl eef63a880a terrain: use a custom drawable for multi-pass render instead of osgFX::Effect
osgFX::Effect is awkward to use because of the lazy-definition of passes, no support for compileGLObjects, useless 'Technique' abstraction and having to define silly methods like 'effectAuthor()'

Handling the multi-pass rendering inside the Drawable also avoids redundant culling tests against the same bounding box for each pass.
8 years ago
Koncord 0c1905e842 [General] Add PreInit packet 8 years ago
Koncord c353e18645 [General] Move Utils from server to components
Rewrite CRC32 functions to the Boost equivalent
8 years ago
David Cernat 0d32bf5943 [General] Add extra death debug, don't request data from player on death 8 years ago
David Cernat 5c269a5f8d [General] Rename ID_GAME_DIE and ID_GAME_RESURRECT 8 years ago
David Cernat 328e3b6618 Merge pull request #167 from OpenMW/master
Add OpenMW commits up to 24 Feb 2017
8 years ago
scrawl e33829d493 Add fork of osgUtil::Optimizer with backported fixes that have not been released yet
Remove optimizers that won't be used.
8 years ago
David Cernat 38ccc2671c Merge pull request #164 from OpenMW/master while resolving conflicts
# Conflicts:
#	apps/openmw/mwmechanics/spellcasting.cpp
8 years ago
scrawl 8f79fa3d72 Add resource statistics panel opened with F4 8 years ago
David Cernat 27c4015f50 [General] Remove unused packet placeholder ID_OBJECT_HEALTH 8 years ago
David Cernat 04d45b9dbb [General] Rename packets to show they are for players only, not NPCs 8 years ago
David Cernat 6328ffb9aa [General] In ID_GAME_ATTRIBUTE & ID_GAME_SKILL, rename GAME into PLAYER 8 years ago
David Cernat 9130c1f302 [General] Rename ID_CONTAINER_ADD into ID_CONTAINER 8 years ago
David Cernat d2cf96af99 [General] Repurpose the unused ID_CONTAINER_REMOVE into ID_OBJECT_HEALTH 8 years ago
David Cernat 958ff06ca8 [General] Rename ID_DOOR_ACTIVATE into ID_DOOR_STATE 8 years ago
David Cernat 9f8f62b765 Merge pull request #137 from OpenMW/master
Add OpenMW commits up to 1 Feb
8 years ago
scrawl 34deb6e7b1 Add 'showSceneGraph' command to export the scene or a particular object to .osgt for debugging purposes 8 years ago
David Cernat 244da19a51 [General] Turn ID_PLAYER_CELL_LOAD into ID_PLAYER_CELL_STATE for clarity 8 years ago
David Cernat 1d9c6ddd81 [General] Add placeholders for the new packet ID_PLAYER_CELL_LOAD 8 years ago
David Cernat e9b22814b9 Create placeholder for ID_GAME_JOURNAL 8 years ago
David Cernat a69f294ef0 Rename ID_GAME_CELL into ID_PLAYER_CELL_CHANGE 8 years ago
Koncord 27afb91936 RPI v3 patch #1 8 years ago
Koncord b1bb552b65 Add packet ActiveSkills 8 years ago
David Cernat 6ea5f08e9c Create placeholder for ID_GAME_SPELLBOOK 8 years ago
David Cernat ae39daf76a Add and implement ID_MUSIC_PLAY 8 years ago
David Cernat b028f0b51f Merge pull request #104 from OpenMW/master
Add OpenMW commits up to 17 Nov
8 years ago
Phillip Andrews c18fc113e5 Changed missing library dependencies to simple fix 8 years ago
David Cernat 46397a7dac Add and implement ID_OBJECT_ANIM_PLAY 8 years ago
David Cernat c205e793cb Add and implement ID_SCRIPT_MEMBER_SHORT 8 years ago
David Cernat 97468980af Add and implement 3 new WorldPackets for ingame script variable values 8 years ago
David Cernat 385b5f39e3 Add and implement ID_OBJECT_ROTATE 8 years ago
David Cernat 0fb9b6eefb On second thought, rename ID_OBJECT_MOVE_WORLD into ID_OBJECT_MOVE 8 years ago
David Cernat 947a677801 Replace ID_ACTIVATOR_ACTIVATE with ID_OBJECT_MOVE_WORLD 8 years ago
David Cernat 4f0a3e8aa1 Add placeholders for 5 new WorldPackets 8 years ago
David Cernat b6111d16cc Add and implement ID_WORLD_VIDEO_PLAY 8 years ago
David Cernat 3fd93896f2 Add and implement ID_WORLD_OBJECT_LOCK 8 years ago
David Cernat 08ea5163c4 Add and implement ID_WORLD_OBJECT_UNLOCK 8 years ago
David Cernat 47ebd24b4a Merge pull request #79 from OpenMW/master while resolving conflicts
# Conflicts:
#	.travis.yml
#	apps/openmw/mwinput/inputmanagerimp.cpp
8 years ago
David Cernat d85a1ee1a9 Fix errors remaining from merge with tes3mp-packetexpansion 8 years ago
David Cernat c639337842 Merge with tes3mp-packetexpansion by fixing conflicts
# Conflicts:
#	apps/openmw-mp/Networking.cpp
#	apps/openmw/mwmp/Networking.cpp
#	components/CMakeLists.txt
#	components/openmw-mp/NetworkMessages.hpp
#	components/openmw-mp/PacketsController.cpp
8 years ago
Koncord c27351c19e Implement inventory functions
AddItem, RemoveItem, GetItemName, GetItemCount, GetItemHealth, GetInventorySize SendInventory
Example:
```lua
tes3mp.AddItem(pid, "glass dagger", 1, 50)
tes3mp.AddItem(pid, "glass dagger", 1, -1)
tes3mp.SendInventory(pid)
tes3mp.RemoveItem(pid, "glass dagger", 1)
tes3mp.SendInventory(pid)
local invSize = tes3mp.GetInventorySize(pid) - 1
for i = 0, invSize do
    print(("%s %d %d"):format(tes3mp.GetItemName(pid, i), tes3mp.GetItemCount(pid, i), tes3mp.GetItemHealth(pid, i)))
end
```
8 years ago
David Cernat 3c49157ed7 Rename WorldPackets to ID_WORLD_OBJECT_DELETE and ID_WORLD_OBJECT_PLACE 8 years ago
David Cernat 565e7e4b9f Create and implement placeholder for ID_WORLD_OBJECT_CREATION 8 years ago
MiroslavR 301dd77efb Save controls state (Fixes #3598) 8 years ago
David Cernat 285f89573d Create placeholders for WorldPacket classes 8 years ago
David Cernat 790d41e278 Move PlayerPackets into their own subfolder 8 years ago
David Cernat d2212ef80b Rename PacketsController into PlayerPacketController 8 years ago
David Cernat fcc793a0af Create a new BasePacket that PlayerPacket inherits from 8 years ago
David Cernat b8f4cb94fb Rename BasePacket into PlayerPacket 8 years ago
David Cernat b6086ab015 Rename ID_GAME_DYNAMICSTATS_CURRENT into ID_GAME_DYNAMICSTATS 8 years ago
David Cernat 26487598a6 Rename ID_GAME_UPDATE_EQUIPED into ID_GAME_EQUIPMENT 8 years ago
David Cernat ce4b326b02 Rename ID_GAME_UPDATE_BASESTATS into ID_GAME_DYNAMICSTATS_CURRENT 8 years ago
David Cernat 046a1ea899 Add packet for player levels 8 years ago
David Cernat 81999a8179 Remove outdated ID_GAME_UPDATE_SKILLS packet, part 2 8 years ago
Koncord cf1a0113a1 Time API 8 years ago
Koncord a661de2a84 PacketClass 8 years ago
David Cernat e39b66af4f Move logger to components 9 years ago
David Cernat d9cfd5bac2 Resolve conflicts with OpenMW 9 years ago
scrawl a44ba0e461 Merge pull request #966 from kpp/find_mygui
Find mygui
9 years ago
Roman Proskuryakov 4cffdb67d8 Uses case-sensitive MyGUI_* variables 9 years ago
David Cernat babba95413 Merge pull request #34 from OpenMW/master
Add OpenMW commits from 1st week of August
9 years ago
Marc Zinnschlag aa1ed9b172 Merge remote-tracking branch 'aesylwinn/RenderWater' 9 years ago
Aesylwinn 5753f52b47 Move water mesh + simple state generation to components library. 9 years ago
David Cernat 8686b9cc12 Merge pull request #29 from OpenMW/master
Add OpenMW commits from end of July
9 years ago
MiroslavR b65f379b7f Save scripted animation state (Fixes #1931, #2150, #3393) 9 years ago
Koncord ed3dc8ca7b Reduced server dependings 9 years ago
AnyOldName3 20f73f4a32 Relocate escape-related code to new files escape.hpp and escape.cpp. 9 years ago
Koncord 9ab77cb123 New API functions: MessageBox, CustomMessageBox, InputDialog
New Callback: OnGUIAction
9 years ago
Aesylwinn b4a000913c Merge remote-tracking branch 'yar/master' into Even
# Conflicts:
#	CMakeLists.txt
#	apps/openmw/mwdialogue/filter.cpp
#	apps/openmw/mwmechanics/character.cpp
#	apps/openmw/mwworld/localscripts.cpp
#	components/CMakeLists.txt
#	components/compiler/exprparser.cpp
#	components/sceneutil/workqueue.cpp
9 years ago
MiroslavR f6f3f71db5 Improve format specifiers for message boxes 9 years ago
Koncord 1b259e2d33 Syncing inventory, animations, position, 8 key attributes
Created Package system
9 years ago
Roman Proskuryakov 3bcd23022a Rewrites FindBullet using LibFindMacros handling version properly 9 years ago
Aesylwinn d141672b53 Pathgrid geometry creator 9 years ago
scrawl a9ad1b09e2 Introduce ShaderManager & ShaderVisitor
Actual shaders still to be written.
9 years ago
scrawl e28dc3e72f Preload instances in SceneManager 9 years ago
scrawl d11c2864df Introduce UnrefQueue to handle the deleting of no longer needed objects in the background thread 9 years ago
scrawl 6f9ca0f68f Add basic cell preloader class
Not properly in use yet, but seems to be working.
9 years ago
scrawl df57d4bfba Use a common base class for resource managers
Implement updateCache to delete unreferenced cached objects when they have not been referenced for a while.
9 years ago
scrawl f99f403dda Rename TextureManager to ImageManager 9 years ago
scrawl 438b30d6f0 Move configureLight to a separate file 9 years ago
scrawl 6546c05428 Move Fallback map to components/ 9 years ago
scrawl 64424e7262 Move keyframe loading out of SceneManager to new KeyframeManager 9 years ago
sandstranger 7d374b36fd change cmake variables 9 years ago
sandstranger 238a5824be add custom new variable fot Qt 9 years ago
sandstranger bd5057aa3c enable opengl es1 9 years ago
scrawl d3fa8a8602 Add osgDB::ObjectCache to the repository to work around it not being available in OSG 3.2 9 years ago
scrawl 3d12b2ca9d Add NifFileManager to avoid duplicate parsing of the NIFFile in SceneManager and BulletShapeManager. 9 years ago
scrawl f962ce0bbe Don't link against unnecessary OSG libraries 9 years ago
scrawl 62169a7039 Use a single-precision PositionAttitudeTransform in speed critical places 9 years ago
scrawl 8cf57ef6ac Move BulletShapeManager and BulletShape to resource/ 9 years ago
scrawl 59aee04ddb Implement ScalingLayer, for layouting of widgets in screen-relative coordinates 9 years ago
scrawl 51f3a8fec6 osgMyGUI: move Platform methods to the .cpp file 9 years ago
Alexander "Ace" Olofsson 7d4125d97f Fixes for building with unity build 9 years ago
scrawl 3a7d0d8dc8 Remove a file that isn't in use yet from build 10 years ago
Koncord 7924ecef3e Fix definition conflict 10 years ago
scrawl f09e4620b6 Move OpenMW version information to a textfile instead of compiling it in
Now we don't need to recompile 3 .cpp files and re-link whenever the current git HEAD changes.
10 years ago
Koncord 73731d27e9 Add ${MYGUI_LIBRARIES} to components/CMakeLists.txt 10 years ago
scrawl f70250a296 Merge branch 'master' of https://github.com/OpenMW/openmw into osg
Conflicts:
	apps/launcher/CMakeLists.txt
	apps/opencs/CMakeLists.txt
	apps/opencs/view/render/worldspacewidget.cpp
	apps/openmw/CMakeLists.txt
	components/CMakeLists.txt
	extern/osg-ffmpeg-videoplayer/CMakeLists.txt
10 years ago
scrawl 89c2a7e26b Fix for possibly missing library on windows 10 years ago
scrawl e13a938896 Add support to build with Qt5 (Task #2665)
Known issue: the render view doesn't work in Qt5. With the switch to OSG around the corner, this isn't worth fixing.
10 years ago
scrawl cf95d3fc35 Refactor cmake scripts, reducing the amount of find_package(Boost) 10 years ago
scrawl fc5176dc38 Refactor cmake scripts, reducing the amount of find_package(Qt4) 10 years ago
scrawl cc71e894e1 Add WorkQueue class 10 years ago
scrawl 4bb3cbf0fb Remove last remains of Ogre 10 years ago
scrawl 974fda5bde Merge branch 'master' of https://github.com/OpenMW/openmw into osg
Conflicts:
	extern/sdl4ogre/sdlwindowhelper.cpp
10 years ago
scrawl cdd0623009 Terrain rendering 10 years ago
scrawl 025a1a7866 Restore savegame screenshot display 10 years ago
scrawl 5442bf23a6 Apply video mode & gamma setting changes 10 years ago
scrawl 9ea416b852 Readded HW cursor manager (no image rotation yet) 10 years ago
scrawl 39fb46601a Readded input & event handling 10 years ago
scrawl 0498e6e5f0 Readded window icon 10 years ago
scrawl 375b736e74 Use SDL to create the window
No input nor event loop handling yet, so the window will "stop responding" after a few seconds.

Thanks to KittyCat for the GraphicsWindowSDL2 code.
10 years ago
scrawl 47758c11cd Readded collision objects and movement physics 10 years ago
scrawl c31b416ba1 Move physicssystem to a new mwphysics module 10 years ago
scrawl c843cfc8e2 Physics stub in preparation for rewrite 10 years ago
scrawl cac288d5be Remove OgreInit 10 years ago
scrawl d9d84bd7b2 Remove bullet raycasting shapes, to be replaced with OSG ray casts 10 years ago
scrawl 9f74be8fcb Add back the custom MyGUI log facility for utf8 paths on windows 10 years ago
scrawl a59940a2c7 Move MyGUI platform to components 10 years ago
k1ll 8e094d6fa5 Add static bullet to components 10 years ago
k1ll b194af4ab2 Add static qt to components 10 years ago
k1ll 00b7712a59 Fix shlwapi include case and add the lib for linking when building for windows 10 years ago
scrawl 372a54bbc7 Dead code removal 10 years ago