Not that it’s really relevant, bit I do really know what I’m talking about - regardless of the issues you mentioned (which are engine issues, not logic ones). [SUB]I’ve been the sole multiplayer programmer on three titles now. One is a 30-player LAN game across PC/Android devices, another is a two-player cat and mouse arena game, and the other is my pet project - what will be an large-scale RTS / FPS mix. Back OT:[/SUB]
Being forced to use RPC’s to control gameplay events is fundamentally false - VehicleGame, ShooterGame, Unreal Tournament & Fortnite use var replication in many situations for good reason, they’re cheaper and more often than not, not time-critical (as a general rule, you want to avoid time & order-critical logic in Multiplayer as much as possible). If you plan on doing Multiplayer with anything more than 2-3 players, or more than a handful of network objects, then you need to make whatever shavings you can. E.g: If something is visible for half a second when it shouldn’t be, it’s not the end of the world, and vice-versa.
You’re right, variable replication is ‘unreliable’ (in network terms), meaning that not every change to that variable will be sent to the Client - but if you don’t need every change and you merely want to replicate the ‘state’ of something, then you can use them safely. The Client will always, eventually mirror the same as the Server, and ‘eventually’ is a matter of seconds at worst (depending on bandwidth usage and latency). If your gameplay logic is not time / order critical, or there’s the possibility that you could in some circumstances flood the network with RPCs - then avoid them.
As an example: In OP’s case - there may be a situation where several powerups are overlapping each other or in close proximity. What happens if the client runs over all of them, or if lots of clients run over different powerups at the same time? If you’re using reliable RPC for that you’re going to see a huge spike - and that’s where games go wrong or out of sync. Reliable RPC’s have double the cost of an unreliable RPC / var replication (the client has to send validation that it received it back to the Server. If it doesn’t, the server will kick the player) - use them sparingly and only when you absolutely must (there are many situations where you have no choice).