Commit graph

61 commits

Author SHA1 Message Date
David Cernat
5f6ddcfc59 [General] Rework container sync to prevent item duping
A main priority in TES3MP development is to avoid making major changes to OpenMW code, so as to avoid merge conflicts in the future. Whenever avoiding potential conflicts seems especially difficult for the proper implementation of a particular multiplayer feature, that multiplayer feature is often put off until later or partially implemented with the intent of being revisited in the future.

Container sync is the perfect example. Previously, the OpenMW code for container actions was kept exactly as it was, with clients unilaterally accepting their own container changes as per singleplayer-specific code, with only the addition that clients sent container packets every time they made a change in a container, packets which were then forwarded unquestioningly by the server to other players. This meant that two players clicking on the same item in a container at the same time both managed to take it, thus duplicating the item.

Immediately after the packets were already forwarded, server scripts were able to check for incorrect changes, such as the removal of more items than should have existed in a container, but they had to send their own packets that attempted to fix what had already been accepted on the initial client and then forwarded to all clients, which was quite onerous in some scenarios, such as when a player on a slow connection immediately dropped items in the world after taking them from a container (which is why the default TES3MP serverside scripts made no attempt at sending corrective packets at all, preferring to expect the matter to be solved in a later C++ implementation).

This commit fixes item duping in containers by preventing container actions from initially running on clients and by ending the automatic forwarding of container packets by the server. Instead, clients now send container packets that act as requests for container actions, and serverside scripts have to forward these requests themselves. In other words, without a matching Container event in the server's Lua scripts, players are completely unable to affect containers for themselves or for others.

To forward a received Container packet, the following line must be used in a Container event in the Lua scripts:

tes3mp.SendContainer(true, true)

When an invalid action count is used in a container request, the serverside scripts can amend it using the following new function:

tes3mp.SetReceivedContainerItemActionCount(objectIndex, itemIndex, actionCount)

Thus, the serverside scripts are able to allow only container actions that are correct based on their own recorded contents for that container.

The OpenMW code allowing unilateral container actions in mwgui/container.cpp is now prevented from executing. When a player's container request is returned to them, code in mwmp/WorldEvent.cpp simulates those container actions instead.
2018-03-26 19:27:36 +03:00
David Cernat
aa448523f8 [Client] Clean up WorldEvent::runConsoleCommands() slightly 2018-01-31 23:23:52 +02:00
David Cernat
ce5670e57e [Client] Ignore invalid object refIds from ObjectPlace packets 2018-01-31 18:51:53 +02:00
David Cernat
420dab10e1 [General] Track objects directly placed by players in ObjectPlace
This allows the OnPCDrop variable to get set correctly even when object placements have to go through the server first in order to gain a unique multiplayer index (mpNum).

Among other things, this makes it possible to roll marijuana joints in the popular mod "Tribunal Code Patch".
2018-01-28 17:46:51 +02:00
David Cernat
5894ffae7d [Client] Ignore dynamic object placements or spawns in packets 2018-01-17 11:01:31 +02:00
David Cernat
a639d3494a [Client] Fix use of DedicatedPlayers as targets for ConsoleCommand 2018-01-05 01:24:15 +02:00
David Cernat
db0e0d376e [Client] Use new code to set the console's Ptrs from server scripts
Previously, reusing the console's object selection code made it so using the same Ptr twice in a row was akin to clicking on the same object twice in the console window, i.e. the object was deselected the second time around. Additionally, that same code was setting key focus to the hidden console window, preventing players from moving until they activated another window (such as their inventory or chat window).
2017-12-26 15:04:28 +02:00
David Cernat
cac2c6c1e8 Merge pull request #360 from TES3MP/0.6.1-openmw-updates while resolving conflicts 2017-12-25 02:25:01 +02:00
David Cernat
993081ba1e [General] Add enchantmentCharge to worldObjects and items 2017-12-23 13:16:38 +02:00
David Cernat
6668b9ab42 [General] Implement ConsoleCommand packet 2017-11-23 00:21:47 +02:00
David Cernat
711c4d83da [Client] Fix build after recent OpenMW changes to GUI 2017-10-07 23:33:36 +03:00
David Cernat
be93ec8ef6 [General] Implement ObjectState packet 2017-07-13 09:46:30 +03:00
Koncord
6222c20e82 [Client] Convert MechanicsHelper to namespace 2017-06-27 16:43:53 +08:00
Koncord
f7341c021f [Client] Modernize loops in WorldEvent to C++11 2017-06-27 15:58:41 +08:00
David Cernat
18bf79e08b [Client] Correctly set mpNum for placed gold 2017-06-09 13:31:19 +03:00
David Cernat
6ac7ee8fcd [Client] Fix problems with NPC equipment sync 2017-06-09 04:58:56 +03:00
David Cernat
f4cdedd8cb [General] Synchronize summoned creatures 2017-05-30 10:11:01 +03:00
David Cernat
4e5c8873e0 [General] Use ObjectSpawn instead of ObjectPlace for actors 2017-05-29 06:59:05 +03:00
David Cernat
7177d56cfb [Client] Only require refNumIndex & mpNum for CellStore::searchExact() 2017-05-27 16:59:23 +03:00
David Cernat
ec921eefc8 [Client] Prevent players from getting stuck in drag and drop when their opened containers are deleted 2017-05-26 02:13:31 +03:00
David Cernat
32879adc5b [General] Allow ObjectTrap to trigger traps, not just disarm them 2017-05-26 01:28:43 +03:00
David Cernat
7ac115b359 [Client] Implement sending and reading of ObjectTrap packets 2017-05-26 00:21:24 +03:00
David Cernat
870fd9a78b [General] Remove ObjectUnlock packet, use ObjectLock with 0 lock instead 2017-05-24 13:28:34 +03:00
David Cernat
46501909ff [Client] Comment out spammy debug about Container packets 2017-05-14 11:08:53 +03:00
David Cernat
aaaed8ab8b [Client] Fix potential object duplication in WorldEvent::placeObjects()
Also clean up the debug messages in WorldEvent so they don't take up multiple lines.
2017-05-07 03:17:19 +03:00
David Cernat
de49f5f175 [General] Add and use isActor bool for WorldObject 2017-05-07 03:07:09 +03:00
David Cernat
9d2c5c3502 [General] Simplify structure of BaseEvent 2017-05-06 21:57:29 +03:00
David Cernat
dcc61a095a [Client] Allow multiple WorldObjects to be added to a WorldEvent 2017-05-06 20:44:39 +03:00
David Cernat
730df061b3 [General] Add hasPositionData and hasStatsDynamicData bools to BaseActor 2017-05-01 19:44:23 +03:00
David Cernat
48b773bfcb [Client] Use float scale for WorldEvent::sendObjectScale() 2017-05-01 19:09:44 +03:00
David Cernat
b6c3830ea0 [General] Rename WorldObject's pos into position for consistency 2017-04-10 09:25:20 +03:00
David Cernat
c52084a028 [General] Use BaseActorLists in ActorPackets 2017-04-09 16:32:44 +03:00
David Cernat
070c6a3bd4 [General] Add ActorPacketController & make controller var names clearer 2017-04-09 08:51:28 +03:00
David Cernat
c2d6265ffd [Client] Reorder methods in WorldEvent, placing packet senders at bottom 2017-04-05 09:12:02 +03:00
David Cernat
9759764699 [Client] Clean up getting and resetting of WorldEvent 2017-04-05 09:04:41 +03:00
David Cernat
d7a760490e [Client] Simplify sending of world packets, part 2 2017-04-05 08:43:35 +03:00
David Cernat
b55a3d5eb2 [Client] Add placeholder editActors() method for random creature sync 2017-04-05 08:07:53 +03:00
David Cernat
4abe295a80 [Client] Simplify sending of world packets by adding WorldEvent methods 2017-04-05 07:54:23 +03:00
David Cernat
1d23a48a42 [Client] Print mpNums when objects are found in a cell 2017-04-05 07:10:22 +03:00
David Cernat
6c60c9c78e [Client] Clean up debug messages for when objects are found in a cell 2017-04-05 06:30:12 +03:00
David Cernat
bb9ea6ccd4 [Client] Also include list of creatures in reply to ActorList 2017-04-05 06:22:01 +03:00
David Cernat
ca92be14a5 [Client] Reply to ActorList request with list of NPCs 2017-04-05 05:54:25 +03:00
David Cernat
2bd81c3de0 [Client] Use mpNum for every WorldObject 2017-04-04 11:07:16 +03:00
David Cernat
4644235cf6 [Client] Use mpNum in exact searches for objects 2017-04-04 10:07:15 +03:00
David Cernat
8cc61b6048 [General] Generate mpNums on the server when forwarding ID_OBJECT_PLACE 2017-04-04 09:23:34 +03:00
David Cernat
e5cf632e1d [Client] Stop creating new reference numbers for placed/spawned objects 2017-04-04 06:01:48 +03:00
Koncord
690211ad99 [General] Extract BaseEvent & BasePlayer from packets to functions
Move Send and Read functions to BasePacket
2017-03-06 18:40:07 +08:00
Koncord
cea1425db1 [Client] Remove redundant newlines & keep ~120 columns 2017-03-04 14:55:35 +08:00
David Cernat
ed2176c984 [Client] Reuse 1 BaseEvent over and over instead of creating new ones 2017-02-23 09:19:09 +02:00
David Cernat
f5470e0b49 [Client] Print cell descriptions for WorldEvents only once 2017-02-21 00:20:19 +02:00