Commit graph

23 commits

Author SHA1 Message Date
David Cernat
f80f3bd484 [Client] Make it possible to reply to requests about specific containers
Previously, a Container packet with a REQUEST action always made the client respond with the contents of all the containers in that cell.

The previous behavior now only happens for requests that have no WorldObjects attached, while requests that have WorldObjects attached get a reply with the contents of those specific containers.
2018-04-01 10:00:39 +03:00
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
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
6668b9ab42 [General] Implement ConsoleCommand packet 2017-11-23 00:21:47 +02:00
David Cernat
be93ec8ef6 [General] Implement ObjectState packet 2017-07-13 09:46:30 +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
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
dcc61a095a [Client] Allow multiple WorldObjects to be added to a WorldEvent 2017-05-06 20:44:39 +03:00
David Cernat
48b773bfcb [Client] Use float scale for WorldEvent::sendObjectScale() 2017-05-01 19:09:44 +03:00
David Cernat
c52084a028 [General] Use BaseActorLists in ActorPackets 2017-04-09 16:32:44 +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
ca92be14a5 [Client] Reply to ActorList request with list of NPCs 2017-04-05 05:54:25 +03: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
3b604a432e [General] Restructure ID_CONTAINER to allow multiple containers at once 2017-02-15 20:14:25 +02:00
David Cernat
c8cbfbef62 [General] Sketch out server requests to players for container data 2017-02-14 19:31:56 +02:00
David Cernat
e703dd42aa [Client] Rename LocalEvent into WorldEvent 2017-02-06 17:40:32 +02:00
Renamed from apps/openmw/mwmp/LocalEvent.hpp (Browse further)