World map & tile addressing
Per-server tile grid 1000×1000 (WorldTileCount = 1000), 1-based linear point-id addressing; season "nine palaces" maps join 9 servers into 3000×3000; city interior grid CityTileCount = 100; TileSize = 2 Unity world-units per tile.
Tile math (exact)
pointId = x + y * tileCount + 1(1-based; 0 = "none")x, y = (pointId-1) % tileCount, (pointId-1) / tileCountworldX = (x + 0.5) * TileSize- Cross-server 64-bit pack:
worldPos = uint64(serverId) << 32 | uint64(pointId)
On nine-palace maps, 1.0.364 C# sets world size to 3000 when the palace list holds 9 servers; a tile's server = grid cell (x / 1000, y / 1000); index x + y * 3000 + 1. Battlefield worlds take size from Lua static.
SFS2X's built-in area-of-interest streaming exists in the SDK and is completely unused — the client streams the visible map itself.
Viewport block pull (C#-owned, never in the Lua catalog)
world.get.block, world.get.new, world.get.cross (cross-server line) — sent by C# WorldPointManager as the camera moves. world.get.block asks up to 160 block indices per request static.
world.get.blockparams:{bigMap, x, y, serverId, worldId, type, viewLvl (≤ 2), timeStamp, index: IntArray (block ids), blockSize, clearUuidSet (first request only), force, leftBottom, rightTop}—leftBottom/rightTopcomputed on the 3000-wide grid.world.get.new={x, y, serverId, type, viewLvl, timeStamp, worldId}- Replies: per-server
serverPointArr[]or flatserverId/worldId; protobuf arrayspoints[](WorldPointInfo),lands[](LandPointInfo),deserts[](DesertInfo),alInfos[]; overlayshotSpots,triggers,greenPoints. After the first request withclearUuidSet=1the client drops every previously known point not returned.push.world.get.blocktriggers re-request.
Query patterns
- Single point:
world.get.detail.new {point, serverId, worldId, previewAssistance, pointType, uid}— field ispoint, notpointId. - Find-nearest:
find.resource,find.enemy.pointsend criteria only (level, type), no coordinates — the server does the search.find.monstersame family but also sendspointId. - Bulk push:
world.get.alliance.city.info,lw.req.world.occupy.info— whole per-server dataset, no pagination; invalidate-then-refetch, not deltas. - Batch by uuid list: radar/detect-event lookups, pipe-delimited uuid lists.
- Marches:
world.get.march.infos {x, y, needCross}near raw tile coord;push.world.march.newcarries protobufWorldMarchorWorldMarchDeltaMetadelta;push.world.march.delcarriesuuid,isBattleFail. 29 world/scene/seasonpush.*are handled only in C#.
Railway / trains (1.0.364) static
train.list {isRefresh: Bool}→ls[](trucks),allianceTrainList[],trainServers(comma-separated);isRefresh: truefrom the Refresh button + first call of the server day.- Entry
type: 1 = truck, 2 = alliance train;cfgId=train_propertyrow; quality 1–5 = N..UR, 10 = Reindeer Sleigh (wire carries onlycfgId). - Cargo
baseGoods/extraGoodseach{full, cur}; goods{type, value}— RewardType 1 = iron, 20 = food, 31 = coins, 7 = item{id, num}. - Train cargo rides in
marchInfo.carriageList[].trainGoods; past raidsmarchInfo.plunderRecord[]; raid countmarchInfo.robTimes— caps: trucktrain_pararow 21 = 2, sleigh 1, alliance trainalliance_train.k10= 3, minus one with VIP aboard.completenessrenders as "Integrity: 0%". - Defensive power:
marchInfo.poweror ΣmarchInfo.heroInfo[].power(truck) / ΣmarchInfo.formation.armyUnit1-3.power(train). train.refresh {uuid, serverId}re-reads one entry; throttled ≥600 s for others' trucks (train_para39), ≥60 s own (row 51). Own daily raidstrainData.dailyRobCount, captrain_pararow 11 = 4, shared trucks/trains. Truck marchWorldMarchcarries the sametrainobject →CSharpCallLuaInterface.AddOrUpdateTrain.
Core commands
world.march.formation.new (dispatch to tile or ;-delimited multi-hop path), alliance.world.mark.add (shared marker), world.favo.add (personal bookmark).